spring ioc註解 IOC

@Autowired  
一、Spring 經過一個 BeanPostProcessor 對 @Autowired 進行解析,因此要讓 @Autowired 起做用必須事先在 Spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean。 
Java代碼   收藏代碼
  1. <!-- 該 BeanPostProcessor 將自動起做用,對標註 @Autowired 的 Bean 進行自動注入 -->  
  2. <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>       

或者使用隱式註冊(隱式註冊 post-processors 包括了 AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor。) 
Java代碼   收藏代碼
  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"             
  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-2.5.xsd  
  7. http://www.springframework.org/schema/context                 
  8. http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
  9.   
  10. <context:annotation-config/>   
  11. </beans>  

二、@Autowired默認按照類型匹配的方式進行注入 
三、@Autowired註解能夠用於成員變量、setter方法、構造器函數等 
四、使用@Autowired註解須有且僅有一個與之匹配的Bean,當找不到匹配的 Bean 或者存在多個匹配的Bean時,Spring 容器將拋出 異常 
五、Spring 容許咱們經過 @Qualifier 註釋指定注入 Bean 的名稱。@Autowired 和 @Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName 了。 
Java代碼   收藏代碼
  1. public class MovieRecommender {  
  2.   
  3. @Autowired  
  4. @Qualifier("mainCatalog")  
  5. private MovieCatalog movieCatalog;  
  6.       
  7.     private CustomerPreferenceDao customerPreferenceDao;  
  8.   
  9.     @Autowired  
  10.     public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {  
  11.         this.customerPreferenceDao = customerPreferenceDao;  
  12.     }  
  13.   
  14.     // ...  
  15. }  



@Resource  
一、@Resource 的做用至關於 @Autowired,只不過 @Autowired 按 byType 自動注入,@Resource 默認按 byName 自動注入罷了。 
二、要讓 JSR-250 的註釋生效,除了在 Bean 類中標註這些註釋外,還須要在 Spring 容器中註冊一個負責處理這些註釋的 BeanPostProcessor 
Java代碼   收藏代碼
  1. <bean  class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>   

三、@Resource 有兩個屬性是比較重要的,分別是 name 和 type,Spring 將 @Resource 註釋的 name 屬性解析爲 Bean 的名字,而 type 屬性則解析爲 Bean 的類型。因此若是使用 name 屬性,則使用 byName 的自動注入策略,而使用 type 屬性時則使用 byType 自動注入策略。若是既不指定 name 也不指定 type 屬性,這時將經過反射機制使用 byName 自動注入策略。 
Java代碼   收藏代碼
  1. public class SimpleMovieLister {  
  2.   
  3.     private MovieFinder movieFinder;  
  4.   
  5.     @Resource  
  6.     public void setMovieFinder(MovieFinder movieFinder) {  
  7.         this.movieFinder = movieFinder;  
  8.     }  
  9. }  



@PostConstruct 和 @PreDestroy  
標註了 @PostConstruct 註釋的方法將在類實例化後調用,而標註了 @PreDestroy 的方法將在類銷燬以前調用。 
Java代碼   收藏代碼
  1. public class CachingMovieLister {  
  2.   
  3.     @PostConstruct  
  4.     public void populateMovieCache() {  
  5.         // populates the movie cache upon initialization...  
  6.     }  
  7.       
  8.     @PreDestroy  
  9.     public void clearMovieCache() {  
  10.         // clears the movie cache upon destruction...  
  11.     }  
  12. }  



@Component  
一、使用@Component註解能夠直接定義Bean,而無需在xml定義。可是若兩種定義同時存在,xml中的定義會覆蓋類中註解的Bean定義。 
二、@Component 有一個可選的入參,用於指定 Bean 的名稱。 
Java代碼   收藏代碼
  1. @Component  
  2. public class ActionMovieCatalog implements MovieCatalog {  
  3.     // ...  
  4. }  

三、<context:component-scan/> 容許定義過濾器將基包下的某些類歸入或排除。Spring 支持如下 4 種類型的過濾方式: 
過濾器類型 表達式範例
annotation org.example.SomeAnnotation
assignable org.example.SomeClass
regex org\.example\.Default.*
aspectj org.example..*Service+

下面這個XML配置會忽略全部的@Repository註解並用「stub」儲存庫代替。 
Java代碼   收藏代碼
  1. <beans ...>  
  2.   
  3.      <context:component-scan base-package="org.example">  
  4.         <context:include-filter type="regex" expression=".*Stub.*Repository"/>  
  5.         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>  
  6.      </context:component-scan>  
  7.   
  8. </beans>  

四、默認狀況下經過 @Component 定義的 Bean 都是 singleton 的,若是須要使用其它做用範圍的 Bean,能夠經過 @Scope 註釋來達到目標 
Java代碼   收藏代碼
  1. @Scope("prototype")  
  2. @Repository  
  3. public class MovieFinderImpl implements MovieFinder {  
  4.     // ...  
  5. }  

五、Spring 2.5引入了更多典型化註解(stereotype annotations): @Component、@Service和 @Controller。 @Component是全部受Spring管理組件的通用形式; 而@Repository、@Service和 @Controller則是@Component的細化, 用來表示更具體的用例(例如,分別對應了持久化層、服務層和表現層) 
Java代碼   收藏代碼
  1. @Service  
  2. public class SimpleMovieLister {  
  3.   
  4.     private MovieFinder movieFinder;  
  5.   
  6.     @Autowired  
  7.     public SimpleMovieLister(MovieFinder movieFinder) {  
  8.         this.movieFinder = movieFinder;  
  9.     }  
  10. }  
  11.   
  12. @Repository  
  13. public class JpaMovieFinder implements MovieFinder {  
  14.     // implementation elided for clarity  
  15. }  

六、要檢測這些類並註冊相應的bean,須要在XML中包含如下元素,其中'basePackage'是兩個類的公共父包 (或者能夠用逗號分隔的列表來分別指定包含各個類的包)。 
Java代碼   收藏代碼
  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"  
  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-2.5.xsd  
  7.            http://www.springframework.org/schema/context  
  8.            http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
  9.                  
  10.      <context:component-scan base-package="org.example"/>  
  11.        
  12. </beans>  

此外,在使用組件掃描元素時,AutowiredAnnotationBeanPostProcessor 和CommonAnnotationBeanPostProcessor會隱式地被包括進來。 也就是說,連個組件都會被自動檢測並織入 - 全部這一切都不須要在XML中提供任何bean配置元數據。 
相關文章
相關標籤/搜索