Spring IOC 常用註解
註冊註解處理器
• 方式一:bean
- <beanclass="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
• 方式二: 名稱空間<context:annotation-config />
<context:annotationconfig />
• 方式三: 名稱空間<context:component-scan />
如果要使註解工作,則必須配置component-scan ,實際上不需要再配置annotation-config。
- <
- <!-- annotation 通過註解來過濾 org.example.SomeAnnotation
- assignable 通過指定名稱過濾 org.example.SomeClass
- regex 通過正則表示式過濾 org\.example\.Default.*
- aspectj 通過aspectj表示式過濾 org.example..*Service+
- -->
- <context:include-filtertype="regex"expression="com.spring.ioc5.*"/>
- <context:exclude-filtertype="annotation"expression="org.springframework.beans.factory.annotation.Autowired"/>
- </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
• 例如
- @required
- public setName(String name){}
@Autowired 採用byType的方式
- @Autowired
- private ISoftPMService softPMService;
- @Autowired(required=false)
- 構造器、欄位、方法
@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屬性作用相同。
- @Qualifier(value = "限定識別符號")
- 欄位、方法、引數
(1)根據基於XML配置中的<qualifier>標籤指定的名字進行注入,使用如下方式指定名稱
- <qualifier type="org.springframework.beans.factory.annotation.Qualifier" value="限定識別符號"/>
- @Autowired
- //根據<qualifier>標籤指定Bean限定識別符號
- publicvoid initDataSource(@Qualifier("mysqlDataSource") DataSource dataSource) {
- this.dataSource = dataSource;
- }
- <bean id="mysqlDataSourceBean"class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <qualifier value="mysqlDataSource"/>
- </bean>
(2)預設的根據Bean名字注入:最基本方式,是在Bean上沒有指定<qualifier>標籤時一種容錯機制,即預設情況下使用Bean識別符號注入,但如果你指定了<qualifier>標籤將不會發生容錯。
- @Autowired
- @Qualifier(value = "mysqlDataSource2") //指定Bean限定識別符號
- //@Qualifier(value = "mysqlDataSourceBean")
- //是錯誤的注入,不會發生回退容錯,因為你指定了<qualifier>
- publicvoid initDataSource(DataSource dataSource) {
- this.dataSource = dataSource;
- }
(3)擴充套件@Qualifier限定描述符註解:對@Qualifier的擴充套件來提供細粒度選擇候選者;
如果我們有兩個資料來源,分別為Mysql和Oracle,因此注入兩者相關資源時就牽扯到資料庫相關,如在DAO層注入SessionFactory時,當然可以採用前邊介紹的方式,但為了簡單和直觀我們希望採用自定義註解方式。
1. 擴充套件@Qualifier限定描述符註解來分別表示Mysql和Oracle資料來源
- /** 表示注入Mysql相關 */
- @Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
- @Retention(RetentionPolicy.RUNTIME)
- @Qualifier
- public@interface Mysql {
-
}
- /** 表示注入Oracle相關 */
- @Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
- @Retention(RetentionPolicy.RUNTIME)
- @Qualifier
- public@interface Oracle {
-
}
- @Autowired
- publicvoid initDataSource(@Mysql DataSource mysqlDataSource, @Oracle DataSource oracleDataSource) {
- this.mysqlDataSource = mysqlDataSource; <