IOC之基於註解的配置bean(上)

一、基於@Component註解的配置

Spring 2.5 中除了提供 @Component 註釋外,還定義了幾個擁有特殊語義的註釋,它們分別是:@Repository、@Service 和 @Controller。
在目前的 Spring 版本中,這 3 個註釋和 @Component 是等效的,但是從註釋類的命名上,很容易看出這 3 個註釋分別和持久層、業務層和控制層(Web 層)相對應。
雖然目前這3 個註釋和 @Component 相比沒有什麼新意,但 Spring 將在以後的版本中爲它們添加特殊的功能。所以,如果 Web 應用程序採用了經典的三層分層結構的話,最好在持久層、業務層和控制層分別採用上述註解對分層中的類進行註釋。

1、@controller 控制器(注入服務)

2、@service 服務(注入dao)

3、@repository dao(實現dao訪問)

4、@component (把普通pojo實例化到spring容器中,相當於配置文件中的<bean id="" class=""/>)


@component用法如下:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. @Component("userDao")  
  2. public class UserDaoImp implements UserDao{  
  3.   
  4.     @Override  
  5.     public void add(User user) {  
  6.         System.out.println(user.getName());    
  7.         System.out.println(user.getSex());   
  8.         System.out.println(user.getAge());   
  9.     }  
  10.   
  11. }  

  在類上使用@Component註解,表示該類定義爲Spring管理Bean,使用默認value(可選)屬性表示Bean標識符。

相當於:

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <bean id="userDao" class="com.mucfc.dao.UserDao"/>  
@Component,@Service,@Controller,@Repository註解的類,並把這些類納入進spring容器中管理。 

下面寫這個是引入component的掃描組件 
[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <!-- 配置的bean所在包的位置 -->    
  2. lt;context:component-scan base-package="com.mucfc" />  
其中base-package爲需要掃描的包(含所有子包) 

@Component泛指組件,當組件不好歸類的時候,我們可以使用這個註解進行標註。

本文工程免費下載

二、使用實例

User.java:用@Repository註解

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.mucfc.model;  
  2. import org.springframework.context.annotation.Scope;  
  3. import org.springframework.stereotype.Repository;  
  4.   
  5. @Repository("user")  
  6. @Scope("prototype")  
  7. //@Repository用於標註數據訪問組件,即DAO組件  
  8. //@Scope("prototype")讓其每次返回不同的實例,默認是單例  
  9. public class User {  
  10.     private String name;  
  11.     private String sex;  
  12.     public String getName() {  
  13.         return name;  
  14.     }  
  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18.     public String getSex() {  
  19.         return sex;  
  20.     }  
  21.     public void setSex(String sex) {  
  22.         this.sex = sex;  
  23.     }  
  24.     public int getAge() {  
  25.         return age;  
  26.     }  
  27.     public void setAge(int age) {  
  28.         this.age = age;  
  29.     }  
  30.     private int age;  
  31.       
  32.   
  33. }  
UserDao.java
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.mucfc.dao;  
  2.   
  3. import com.mucfc.model.User;  
  4.   
  5. public interface UserDao {  
  6.     public void add(User user);  
  7. }  
UserDaoImp.java:用@Controller註解
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.mucfc.daoimp;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4.   
  5. import com.mucfc.dao.UserDao;  
  6. import com.mucfc.model.User;  
  7.   
  8. @Controller("userDao")  
  9. //@Controller用於標註控制層組件  
  10. public class UserDaoImp implements UserDao{  
  11.   
  12.     @Override  
  13.     public void add(User user) {  
  14.         System.out.println(user.getName());    
  15.         System.out.println(user.getSex());   
  16.         System.out.println(user.getAge());   
  17.     }  
  18.   
  19. }  
UserService.java:用@Service註解
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.mucfc.service;  
  2. import javax.annotation.Resource;  
  3.   
  4. import org.springframework.stereotype.Service;  
  5.   
  6. import com.mucfc.dao.UserDao;  
  7. import com.mucfc.model.User;  
  8.   
  9. @Service("userService")  
  10. //@Service用於標註業務層組件  
  11. public class UserService {  
  12.      //setter注入接口、面向接口編程    
  13.     private UserDao userdao ;    
  14.     public void add(User user){    
  15.         userdao.add(user) ;    
  16.     }    
  17.     public UserDao getUserdao() {    
  18.         return userdao;    
  19.     }    
  20.     //註解    
  21.     @Resource(name="userDao")    
  22.     public void setUserdao(UserDao userdao) {    
  23.         this.userdao = userdao;    
  24.     }    
  25. }  

beans.xml'

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans    
  6.                 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
  7.         http://www.springframework.org/schema/context    
  8.         http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
  9.      <!-- 配置的bean所在包的位置 -->    
  10.     <context:component-scan base-package="com.mucfc" />  
  11. </beans>  

測試下:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.mucfc.anno;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. import com.mucfc.model.User;  
  7. import com.mucfc.service.UserService;  
  8.   
  9.   
  10. public class Test {  
  11.   
  12.     public static void main(String[] args) {  
  13.         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");  
  14.         UserService service=(UserService)applicationContext.getBean("userService");  
  15.         User user1 = (User) applicationContext.getBean("user");   
  16.         User user2 = (User) applicationContext.getBean("user");  
  17.         user1.setName("小明");  
  18.         user1.setSex("男");  
  19.         user1.setAge(22);  
  20.           
  21.         user2.setName("小紅");  
  22.         user2.setSex("女");  
  23.         user2.setAge(18);  
  24.           
  25.         service.add(user1);  
  26.         service.add(user2);  
  27.     }  
  28.   
  29. }  
結果:



當在組件類中使用了特定的註解之後,還需要在Spring的配置文件中聲明 <context:component-scan>:

  • base-package屬性指定一個需要掃描的基類包,Spring容器將會掃描整個基類包裏及其子包中的所有類
  • 當需要掃描多個包時,可以使用逗號分隔
  • 如果僅希望掃描特定的類而非基包下的所有類,可使用resource-pattern屬性過濾特定的類,實例:   
  • <context:include-filter>子節點表示要包含的目標類
  • <context:exclude-filter>子節點表示要排除在外的目標類
  • <context:component-scan>下可以擁有若干個<context:include-filter>和<context:exclude-filter>子節點
  • <context:include-filter>和<context:exclude-filter>子節點支持多種類型的過濾表

三、更多的配置元數據

1、@Lazy:定義Bean將延遲初始化,使用方式如下:

 

java代碼:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. @Component("component")  
  2. @Lazy(true)  
  3. public class TestCompoment {  
  4. ……  
  5. }  

    使用@Lazy註解指定Bean需要延遲初始化。

 

2、@DependsOn:定義Bean初始化及銷燬時的順序,使用方式如下:

 

java代碼:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. @Component("component")  
  2. @DependsOn({"managedBean"})  
  3. public class TestCompoment {  
  4. ……  
  5. }  

3、@Scope:定義Bean作用域,默認單例,使用方式如下:

 

java代碼:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. @Component("component")  
  2. @Scope("singleton")  
  3. public class TestCompoment {  
  4. ……  
  5. }  

4、@Qualifier:指定限定描述符,對應於基於XML配置中的<qualifier>標籤,使用方式如下:

 

java代碼:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. @Component("component")  
  2. @Qualifier("component")  
  3. public class TestCompoment {  
  4. ……  
  5. }  

    可以使用複雜的擴展,如@Mysql等等。

 

 

5、@Primary:自動裝配時當出現多個Bean候選者時,被註解爲@Primary的Bean將作爲首選者,否則將拋出異常,使用方式如下:

 

java代碼:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. @Component("component")  
  2. @Primary  
  3. public class TestCompoment {  
  4. ……  
  5. }  

本文工程免費下載

林炳文Evankaka原創作品。轉載請註明出處http://blog.csdn.net/evankaka

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章