1. 程式人生 > >Spring IOC 常用註解

Spring IOC 常用註解

註解實現Bean配置主要用來進行如依賴注入、生命週期回撥方法定義等,不能消除XML檔案中的Bean元資料定義,且基於XML配置中的依賴注入的資料將覆蓋基於註解配置中的依賴注入的資料
註冊註解處理器

 方式一:bean

  1. <beanclass="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

 方式二: 名稱空間<context:annotation-config />

<context:annotationconfig />

 將隱式地向Spring 容器註冊AutowiredAnnotationBeanPostProcessor 、CommonAnnotationBeanPostProcessor 、 PersistenceAnnotationBeanPostProcessor 以及RequiredAnnotationBeanPostProcessor 這4 個BeanPostProcessor 。

 方式三: 名稱空間<context:component-scan />

如果要使註解工作,則必須配置component-scan ,實際上不需要再配置annotation-config。

  1. <
    context:component-scanbase-package="com.spring.ioc5">
  2.         <!-- annotation 通過註解來過濾          org.example.SomeAnnotation    
  3.              assignable 通過指定名稱過濾        org.example.SomeClass  
  4.              regex      通過正則表示式過濾      org\.example\.Default.*  
  5.              aspectj    通過aspectj表示式過濾  org.example..*Service+  
  6.          -->
  7.         <context:include-filtertype="regex"expression="com.spring.ioc5.*"/>
  8.         <context:exclude-filtertype="annotation"expression="org.springframework.beans.factory.annotation.Autowired"/>
  9. </context:component-scan>

• Spring 支援以下4 種類型的過濾方式:

     • 註解 org.example.SomeAnnotation 將所有使用SomeAnnotation 註解的類過濾出來

     • 類名指定 org.example.SomeClass 過濾指定的類

     • 正則表示式 com.kedacom.spring.annotation.web..* 通過正則表示式過濾一些類

     • AspectJ 表示式 org.example..*Service+ 通過AspectJ 表示式過濾一些類


Spring3的基於註解實現Bean依賴注入支援如下三種註解:

  • Spring自帶依賴注入註解: Spring自帶的一套依賴注入註解;
  • JSR-250註解:Java平臺的公共註解,是Java EE 5規範之一,在JDK6中預設包含這些註解,從Spring2.5開始支援。
  • JSR-330註解:Java 依賴注入標準,Java EE 6規範之一,可能在加入到未來JDK版本,從Spring3開始支援;
  • JPA註解:用於注入持久化上下文和屍體管理器。


@Required

         • 例如 

  1. @required
  2. public  setName(String name){}  
@ required 負責檢查一個bean在初始化時其宣告的 set方法是否被執行, 當某個被標註了 @Required 的 Setter 方法沒有被呼叫,則 Spring 在解析的時候會丟擲異常,以提醒開發者對相應屬性進行設定。 @Required 註解只能標註在 Setter 方法之上。因為依賴注入的本質是檢查 Setter 方法是否被呼叫了,而不是真的去檢查屬性是否賦值了以及賦了什麼樣的值。如果將該註解標註在非 setXxxx() 型別的方法則被忽略。

@Autowired 採用byType的方式 

  1. @Autowired
  2. private ISoftPMService softPMService;  
  1. @Autowired(required=false)  
  2.     構造器、欄位、方法  

       @Autowired根據bean 型別從spring 上線文中進行查詢,註冊型別必須唯一,否則報異常。與@Resource 的區別在於,@Resource 允許通過bean 名稱或bean 型別兩種方式進行查詢@Autowired(required=false) 表示,如果spring 上下文中沒有找到該型別的bean 時, 才會使用new SoftPMServiceImpl();
       @Autowired 標註作用於 Map 型別時,如果 Map 的 key 為 String 型別,則 Spring 會將容器中所有型別符合 Map 的 value 對應的型別的 Bean 增加進來,用 Bean 的 id 或 name 作為 Map 的 key。
       @Autowired 還有一個作用就是,如果將其標註在 BeanFactory 型別、ApplicationContext 型別、ResourceLoader 型別、ApplicationEventPublisher 型別、MessageSource 型別上,那麼 Spring 會自動注入這些實現類的例項,不需要額外的操作。


@Qualifier 和@AutoWired聯合使用,自動裝配的策略就變成byName

  使用@Autowired時,如果找到多個同一型別的bean,則會拋異常,此時可以使用 @Qualifier("beanName"),明確指定bean的名稱進行注入,此時與 @Resource指定name屬性作用相同。

  1. @Qualifier(value = "限定識別符號")     
  2. 欄位、方法、引數    

(1)根據基於XML配置中的<qualifier>標籤指定的名字進行注入,使用如下方式指定名稱 
  1. <qualifier  type="org.springframework.beans.factory.annotation.Qualifier"  value="限定識別符號"/>    
其中type屬性可選,指定型別,預設就是Qualifier註解類,name就是給Bean候選者指定限定識別符號,一個Bean定義中只允許指定型別不同的<qualifier>,如果有多個相同type後面指定的將覆蓋前面的。
  1. @Autowired
  2.    //根據<qualifier>標籤指定Bean限定識別符號  
  3.    publicvoid initDataSource(@Qualifier("mysqlDataSource") DataSource dataSource) {    
  4.        this.dataSource = dataSource;    
  5.    }    
使用@Qualifier("mysqlDataSource")來指定候選Bean的限定識別符號,我們需要在配置檔案中使用<qualifier>標籤來指定候選Bean的限定識別符號“mysqlDataSource”:
  1. <bean id="mysqlDataSourceBean"class="org.springframework.jdbc.datasource.DriverManagerDataSource">   
  2.      <qualifier value="mysqlDataSource"/>   
  3. </bean>  

(2)預設的根據Bean名字注入:最基本方式,是在Bean上沒有指定<qualifier>標籤時一種容錯機制,即預設情況下使用Bean識別符號注入,但如果你指定了<qualifier>標籤將不會發生容錯。
  1. @Autowired
  2. @Qualifier(value = "mysqlDataSource2"//指定Bean限定識別符號 
  3. //@Qualifier(value = "mysqlDataSourceBean") 
  4. //是錯誤的注入,不會發生回退容錯,因為你指定了<qualifier> 
  5. publicvoid initDataSource(DataSource dataSource) {   
  6. this.dataSource = dataSource;   
  7.     }   

(3)擴充套件@Qualifier限定描述符註解:對@Qualifier的擴充套件來提供細粒度選擇候選者;
如果我們有兩個資料來源,分別為Mysql和Oracle,因此注入兩者相關資源時就牽扯到資料庫相關,如在DAO層注入SessionFactory時,當然可以採用前邊介紹的方式,但為了簡單和直觀我們希望採用自定義註解方式。
1. 擴充套件@Qualifier限定描述符註解來分別表示Mysql和Oracle資料來源
  1. /** 表示注入Mysql相關 */
  2. @Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})   
  3. @Retention(RetentionPolicy.RUNTIME)   
  4. @Qualifier
  5. public@interface Mysql {   
  6. }  

  1. /** 表示注入Oracle相關 */
  2. @Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})   
  3. @Retention(RetentionPolicy.RUNTIME)   
  4. @Qualifier
  5. public@interface Oracle {   
  6. }  

  1. @Autowired
  2. publicvoid initDataSource(@Mysql DataSource mysqlDataSource, @Oracle DataSource oracleDataSource) {   
  3. this.mysqlDataSource = mysqlDataSource;   <