Spring的bean管理(注解方式)


注解:代碼中的特殊標記,注解可以使用在類、方法、屬性上面,使用注解可實現一些基本的功能。注解的寫法是@注解名稱(屬性=屬性值)

使用注解創建對象

第一步,創建Web項目,引入Spring的開發包 
第二步,編寫相關的類

在src目錄下創建一個cn.itcast.anno包,並在該包下編寫一個User類。

public class User {

    public void add() {
        System.out.println("add....................");
    }

}

第三步,創建Spring配置文件

  • 在Spring配置文件中引入約束,如下:
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">
  • 在Spring配置文件中做些事情,即開啟注解掃描。
    <!-- 開啟注解的掃描。到配置的包里面掃描類、方法、屬性上面是否有注解 -->
    <context:component-scan base-package="cn.itcast"></context:component-scan>

    注意:也可以這樣開啟注解掃描,如下:

    <context:annotation-config></context:annotation-config>

    但是這種開啟注解掃描的方式,只會掃描屬性上面的注解。實際開發中用到的並不多!故不推薦使用。

第四步,在創建對象所在的類上面使用注解實現

@Component(value="user") // 類似於<bean id="user" class="..." />
public class User {

    public void add() {
        System.out.println("add....................");
    }

}

如若注解里面屬性名稱是value,則可以省略,所以上面的User類亦可這樣寫為:

@Component("user") // 類似於<bean id="user" class="..." />
public class User {

    public void add() {
        System.out.println("add....................");
    }

}

 

第五步,編寫測試類 
在cn.itcast.anno包下編寫一個TestDemo單元測試類。

public class TestDemo {

    @Test
    public void testUser() {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        User user = (User) context.getBean("user");
        System.out.println(user);
        user.add();
    }

}

 

Spring的bean管理中常用的注解

創建對象的注解有四個:

  1. @Component:作用在類上
  2. @Repository:用於對DAO實現類進行標注(持久層)。
  3. @Service:用於對Service實現類進行標注(業務層)。
  4. @Controller:用於對Controller實現類進行標注(WEB層)。

后三個注解是Spring中提供的@Component的三個衍生注解(功能目前來講是一樣的),它們是為了讓標注類本身的用途更清晰,Spring在后續的版本中會對其進行增強。

bean的作用范圍的注解

@Scope

  • singleton:單例,默認值
  • prototype:多例

所以我們可通過注解設置創建對象是單例或者還是多實例的。這樣User類的代碼亦可寫為:

@Service("user")
@Scope("singleton")
public class User {

    public void add() {
        System.out.println("add....................");
    }

}

使用注解注入屬性(對象)

這兒,我舉個例子來說明如何使用注解注入(對象類型的)屬性。 
先創建業務層中的UserService類:

public class UserService {
    public void add() {
        System.out.println("service...........");
    }
}

再創建持久層中的UserDao類:

public class UserDao {
    public void add() {
        System.out.println("dao................");
    }
}

以上兩個類都創建在cn.itcast.anno包中。我們要實現的目的是在UserService類里面調用UserDao類的方法,這樣我們就要在UserService類里面得到UserDao類的對象。之前是采用xml配置文件的方式來注入屬性的,本文將使用注解的方式完成注入屬性的操作。

  1. 在UserService類里面定義UserDao類型屬性
    private UserDao userDao;

    在UserService類里面定義UserDao類型的屬性,由於是使用注解的方式,故不需要手動生成set方法。

  2. 進行注解方式實現屬性注入
    1. 創建UserDao類的對象和UserService類的對象
      @Service("userService")
      public class UserService {
      
          private UserDao userDao;
      
          public void add() {
              System.out.println("service...........");
              userDao.add();
          }
      
      }
      @Repository("userDao")
      public class UserDao {
      
          public void add() {
              System.out.println("dao................");
          }
      }

       

    2. 在UserService類里面注入UserDao類的對象,使用注解來實現。首先我使用@Autowired注解來實現。
      @Service("userService")
      public class UserService {
      
          @Autowired
          private UserDao userDao;
      
          public void add() {
              System.out.println("service...........");
              userDao.add();
          }
      
      }

      注意:使用注解@Autowired,它不是根據名字去找Dao,而是默認按類型進行裝配。 
      當然了,也可使用@Resource注解來實現,如下:

      @Service("userService")
      public class UserService {
      
          @Resource(name="userDao")
          private UserDao userDao;
      
          public void add() {
              System.out.println("service...........");
              userDao.add();
          }
      
      }

      注意,使用@Resource注解,它默認是按名稱進行注入的。在實際開發中,我們也是使用@Resource注解來注入屬性的,注解@Autowired用到的並不多。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM