spring annotation

 
http://blog.csdn.net/kaiwii/article/details/7877663
@Autowired 
1、Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。 
Java代码 复制代码 收藏代码
  1. <!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 -->
  2. <beanclass="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
[java] view plain copy
 
  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. <context:annotation-config/>
  10. </beans>
[java] view plain copy
 
  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>  

2、@Autowired默认按照类型匹配的方式进行注入 
3、@Autowired注解可以用于成员变量、setter方法、构造器函数等 
4、使用@Autowired注解须有且仅有一个与之匹配的Bean,当找不到匹配的 Bean 或者存在多个匹配的Bean时,Spring 容器将抛出 异常 
5、Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称。@Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。 
Java代码 复制代码 收藏代码
  1. public class MovieRecommender {
  2. @Autowired
  3. @Qualifier("mainCatalog")
  4. private MovieCatalog movieCatalog;
  5. private CustomerPreferenceDao customerPreferenceDao;
  6. @Autowired
  7. public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
  8. this.customerPreferenceDao = customerPreferenceDao;
  9. }
  10. // ...
  11. }
[java] view plain copy
 
  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 
1、@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,@Resource 默认按 byName 自动注入罢了。 
2、要让 JSR-250 的注释生效,除了在 Bean 类中标注这些注释外,还需要在 Spring 容器中注册一个负责处理这些注释的 BeanPostProcessor 
Java代码 复制代码 收藏代码
  1. <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
[java] view plain copy
 
  1. <bean  class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>   

3、@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将 @Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。 
Java代码 复制代码 收藏代码
  1. public class SimpleMovieLister {
  2. private MovieFinder movieFinder;
  3. @Resource
  4. public void setMovieFinder(MovieFinder movieFinder) {
  5. this.movieFinder = movieFinder;
  6. }
  7. }
[java] view plain copy
 
  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. @PostConstruct
  3. public void populateMovieCache() {
  4. // populates the movie cache upon initialization...
  5. }
  6. @PreDestroy
  7. public void clearMovieCache() {
  8. // clears the movie cache upon destruction...
  9. }
  10. }
[java] view plain copy
 
  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 
1、使用@Component注解可以直接定义Bean,而无需在xml定义。但是若两种定义同时存在,xml中的定义会覆盖类中注解的Bean定义。 
2、@Component 有一个可选的入参,用于指定 Bean 的名称。 
Java代码 复制代码 收藏代码
  1. @Component
  2. public class ActionMovieCatalog implements MovieCatalog {
  3. // ...
  4. }
[java] view plain copy
 
  1. @Component  
  2. public class ActionMovieCatalog implements MovieCatalog {  
  3.     // ...  
  4. }  

3、<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. <context:component-scan base-package="org.example">
  3. <context:include-filter type="regex" expression=".*Stub.*Repository"/>
  4. <context:exclude-filter type="annotation"expression="org.springframework.stereotype.Repository"/>
  5. </context:component-scan>
  6. </beans>
[java] view plain copy
 
  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>  

4、默认情况下通过 @Component 定义的 Bean 都是 singleton 的,如果需要使用其它作用范围的 Bean,可以通过 @Scope 注释来达到目标 
Java代码 复制代码 收藏代码
  1. @Scope("prototype")
  2. @Repository
  3. public class MovieFinderImpl implements MovieFinder {
  4. // ...
  5. }
[java] view plain copy
 
  1. @Scope("prototype")  
  2. @Repository  
  3. public class MovieFinderImpl implements MovieFinder {  
  4.     // ...  
  5. }  

5、Spring 2.5引入了更多典型化注解(stereotype annotations): @Component、@Service和 @Controller。 @Component是所有受Spring管理组件的通用形式; 而@Repository、@Service和 @Controller则是@Component的细化, 用来表示更具体的用例(例如,分别对应了持久化层、服务层和表现层) 
Java代码 复制代码 收藏代码
  1. @Service
  2. public class SimpleMovieLister {
  3. private MovieFinder movieFinder;
  4. @Autowired
  5. public SimpleMovieLister(MovieFinder movieFinder) {
  6. this.movieFinder = movieFinder;
  7. }
  8. }
  9. @Repository
  10. public class JpaMovieFinder implements MovieFinder {
  11. // implementation elided for clarity
  12. }
[java] view plain copy
 
  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. }  

6、要检测这些类并注册相应的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. <context:component-scan base-package="org.example"/>
  10. </beans>
[java] view plain copy
 
  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配置元数据。 
原文地址:https://www.cnblogs.com/exe19/p/5398284.html