Spring注解是如何生效的?

现在大部分开发已经采用Spring Boot了,少了很多配置文件,方便了许多。以前在使用注解,比如@Autowired、@Resource 或者事务相关的一些注解时,我们会首先在配置文件里面加入这样的配置:

context:component-scan
context:annotation-config
tx:annotation-driven

这样就能告诉Spring容器在启动的时候,把相应的后处理器(BeanPostProcessor)初始化,交给Spring容器来管理,然后通过这些后处理器 去实现 各种注解(的功能),比如实现:@Autowired 默认 按类型注入属性 。具体来说,@Autowired 是Spring框架提供的注解,它是由AutowiredAnnotationBeanPostProcessor 后处理器实现的;@Resource 是JDK里面提供的注解,它由CommonAnnotationBeanPostProcessor实现注入的功能。

那使用了Spring Boot之后,几乎已经看不到上述配置了,简单来说:Spring Boot应用程序在启动的时候,默认加载了一批BeanPostProcessor,这样就可以实现这些注解的功能了。这是怎么做到的呢?

我们知道,Spring Boot应用程序会在Application启动类中标上 @SpringBootApplication 注解。这个注解包含了三个子注解:

  • SpringBootConfiguration 将Application启动类作为Bean类注入到Spring容器中
  • EnableAutoConfiguration 实现自动配置功能
  • ComponentScan 实现自动扫描的功能,具体来说:就是告诉Spring容器注册"一些"Bean后处理器,从而能够支持各种注解。

比如说,要想让@Autowired生效,Spring容器必须加载了AutowiredAnnotationBeanPostProcessor 后处理器,看这个类的源码注释:

A default AutowiredAnnotationBeanPostProcessor will be registered by the "context:annotation-config" and "context:component-scan" XML tags.

因此,只要我们在XML配置文件里面配置了 context:component-scan,AutowiredAnnotationBeanPostProcessor 就能被注册到Spring容器中。而使用Spring Boot之后,由@SpringBootApplication注解下面的@ComponentScan 完成了同样的功能。这就是不需要我们自己在XML配置文件里面写一行 context:component-scan 配置的原因。

类似地:CommonAnnotationBeanPostProcessor 实现了 @Resource 注解的功能,看看它的类源码注释可知:它负责实现@PostConstruct、@PreDestroy、@Resource等注解,配置了 @ComponentScan 就能将它注册到Spring容器中。

最后再来说说开启事务的注解@EnableTransactionManagement:
当我们在Application启动类 上标注 @EnableTransactionManagement 时,就表示开启事务,它等价于XML配置方式 tx:annotation-driven

原文地址:https://www.cnblogs.com/hapjin/p/12215123.html

Spring注解是如何生效的?相关推荐

  1. Spring Boot 关于 @EnableConfigurationProperties 注解 —— 使用 @ConfigurationProperties 注解的类生效。

    先说作用: @EnableConfigurationProperties注解的作用是:使用 @ConfigurationProperties 注解的类生效. 说明: 如果一个配置类只配置@Config ...

  2. Spring注解不生效事件

    在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解是不会生效的. 原因: 通过Spring注解标识的方法,在Spring加载类的时候会生成代理类,通过 ...

  3. @aspect注解类不生效_springboot:@Transactional注解 VS @Service注解

    1. Transactional注解与Service/Component注解冲突? 之前遇到一个神奇的事情--用Transactional注解的方法,数据处理了一半,后面的数据处理抛出异常后,没有回滚 ...

  4. java事务不生效场景_springboot中使用@Transactional注解事物不生效的坑

    一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...

  5. 加上项目路径 spring security忽略不生效_Spring 常见面试题「收藏」

    Spring 常见面试题 1 Spring框架是什么?它的主要模块有哪些? Spring框架是一个Java平台,提供全面的基础设施支持开发Java应用程序.Spring处理基础设施部分,这样你就可以专 ...

  6. 浅谈Spring注解

    Spring目前的趋势是使用注解结合Java代码而不是配置来定义行为.属性.功能.规则和扩展点,因此梳理注解也是梳理Spring功能点的很好的方式,全面的梳理可以补足我们知识点的漏洞. 查找所有注解 ...

  7. ❤️使用Spring注解开发(建议收藏)

    ❤️使用注解开发 在Spring4之后,要使用注解开发,必须保证aop的包导入了 使用注解开发需要导入context约束,增加注解的支持! <?xml version="1.0&quo ...

  8. Spring注解开发配置

    applicationContext.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <bean ...

  9. springboot 调用方法事物_springboot中使用@Transactional注解事物不生效的坑

    一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...

最新文章

  1. Webpack学习-工作原理(上)
  2. postgres 退出_centos如何退出postges?
  3. 【Leetcode | 1】93. 复原IP地址
  4. 给所有使用FMX(FireMonkey)进行开发的忠告!
  5. 《算法概论》第八章NP完全问题部分习题解
  6. 岩板铺地好吗_铺地的石板如何用处高逼格,三个大师案例来教你!
  7. 记录使用itextpdf通过定位插入图片和文字
  8. 计算机重启命令编码,电脑倒计时重启代码是什么
  9. 幼儿园作业(毕业季)
  10. 全自动反冲洗叠片过滤器
  11. c语言各种输出错误提示,C语言错误处理-输出错误信息
  12. 人工智能语言python培训
  13. Go入门-Go语言环境安装与GoLand第一个项目创建
  14. 联想领像L100D黑白激光打印机 评测
  15. USB2.0接口CM4_5G mini驱动板搭配广和通FM150在Win11下的测速
  16. 什么才是网络工程师?
  17. 五、MySQL主从复制原理
  18. getprop (dns)
  19. 「技术分享」汽车检测移动机器人应用,科聪赋能智能数字化检测!
  20. Office EXCEL 如何实现在单元格内换行

热门文章

  1. 如何升级手机android系统,安卓手机系统怎么升级,安卓手机系统升级教程
  2. Robocup 仿真2D 学习笔记(四)阵型编辑
  3. 美国项目管理协会宣布从Net Objectives手中收购FLEX
  4. 【从零单排之微软面试100题系列】09二叉查找树的后序遍历
  5. python字典保存用户名和密码_Python开发之用户密码存储
  6. 【自信】不自信的人可能有以下表现
  7. 计算机科学与技术专业自考自学资料
  8. 计算机组成原理笔记(哈工大刘宏伟)第四章 存储器
  9. 如何找到电影的下载链接
  10. 在线支付之易宝支付的使用方法