spring annotation

来源:互联网 发布:淘宝上卖茶叶怎么样 编辑:程序博客网 时间:2024/05/03 11:31
@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. <context:annotation-config/>
  10. </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. }



@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. private MovieFinder movieFinder;
  3. @Resource
  4. public void setMovieFinder(MovieFinder movieFinder) {
  5. this.movieFinder = movieFinder;
  6. }
  7. }



@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. }



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

4、默认情况下通过 @Component 定义的 Bean 都是 singleton 的,如果需要使用其它作用范围的 Bean,可以通过 @Scope 注释来达到目标
Java代码 复制代码 收藏代码
  1. @Scope("prototype")
  2. @Repository
  3. public class MovieFinderImplimplements 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 JpaMovieFinderimplements MovieFinder {
  11. // implementation elided for clarity
  12. }

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>

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 steam账号被找回怎么办 steam密码忘记了怎么办 steam邮箱忘了怎么办 专票密码区压线怎么办 发票压线一点点怎么办 住顶楼太热怎么办 公司经营期限到期怎么办 小黄车不在运营区域内怎么办 去韩国不懂韩语怎么办 一类在会计分录怎么办 想去韩国整容怎么办 抄经写错字怎么办贴吧 佛经抄错了怎么办 踏板摩托声音大怎么办 法语面签听不懂怎么办 常州出生证丢了怎么办 分公司就俩个人怎么办 分公司就三个人怎么办 转账支票作废后怎么办 干组织不是党员怎么办 宾馆客人逃房费怎么办 cad图太大打不开怎么办 cad文字输入不了怎么办 word打不了汉字怎么办 电脑浏览器卡顿怎么办 文档里输入不了怎么办 淘宝退款卖家不处理怎么办 抵押合同丢了怎么办 抵押合同丢失了怎么办 发票货物名称多怎么办 发票上少打一个字怎么办 发票名称带星号怎么办 小贷太多还不上怎么办 生日当天买保险怎么办 我挪用公司货款怎么办 车辆改名字保险怎么办 工伤报案周六日怎么办 五菱宏光s1门下沉怎么办 新手机版本更新怎么办 戴尔电脑开机黑屏怎么办 淘宝退货不发货怎么办