首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring Annotation 札记——IOC篇

2012-09-01 
Spring Annotation 笔记——IOC篇@Autowired?1、Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,

Spring Annotation 笔记——IOC篇

@Autowired?
1、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>??

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. ??
  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"/>???

3、@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?
1、使用@Component注解可以直接定义Bean,而无需在xml定义。但是若两种定义同时存在,xml中的定义会覆盖类中注解的Bean定义。?
2、@Component 有一个可选的入参,用于指定 Bean 的名称。?
Java代码?
  1. @Component??
  2. public?class?ActionMovieCatalog?implements?MovieCatalog?{??
  3. ????//?...??
  4. }??

3、<context:component-scan/> 允许定义过滤器将基包下的某些类纳入或排除。Spring 支持以下 4 种类型的过滤方式:?
过滤器类型表达式范例annotationorg.example.SomeAnnotationassignableorg.example.SomeClassregexorg\.example\.Default.*aspectjorg.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>??

4、默认情况下通过 @Component 定义的 Bean 都是 singleton 的,如果需要使用其它作用范围的 Bean,可以通过 @Scope 注释来达到目标?
Java代码?
  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. ??
  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. ?????????????????
  10. ?????<context:component-scan?base-package="org.example"/>??
  11. ???????
  12. </beans>??


此外,在使用组件扫描元素时,AutowiredAnnotationBeanPostProcessor 和CommonAnnotationBeanPostProcessor会隐式地被包括进来。 也就是说,连个组件都会被自动检测并织入 - 所有这一切都不需要在XML中提供任何bean配置元数据。?

转:http://kdboy.iteye.com/blog/419159

热点排行