Spring注解是如何生效的?
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注解是如何生效的?相关推荐
- Spring Boot 关于 @EnableConfigurationProperties 注解 —— 使用 @ConfigurationProperties 注解的类生效。
先说作用: @EnableConfigurationProperties注解的作用是:使用 @ConfigurationProperties 注解的类生效. 说明: 如果一个配置类只配置@Config ...
- Spring注解不生效事件
在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解是不会生效的. 原因: 通过Spring注解标识的方法,在Spring加载类的时候会生成代理类,通过 ...
- @aspect注解类不生效_springboot:@Transactional注解 VS @Service注解
1. Transactional注解与Service/Component注解冲突? 之前遇到一个神奇的事情--用Transactional注解的方法,数据处理了一半,后面的数据处理抛出异常后,没有回滚 ...
- java事务不生效场景_springboot中使用@Transactional注解事物不生效的坑
一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...
- 加上项目路径 spring security忽略不生效_Spring 常见面试题「收藏」
Spring 常见面试题 1 Spring框架是什么?它的主要模块有哪些? Spring框架是一个Java平台,提供全面的基础设施支持开发Java应用程序.Spring处理基础设施部分,这样你就可以专 ...
- 浅谈Spring注解
Spring目前的趋势是使用注解结合Java代码而不是配置来定义行为.属性.功能.规则和扩展点,因此梳理注解也是梳理Spring功能点的很好的方式,全面的梳理可以补足我们知识点的漏洞. 查找所有注解 ...
- ❤️使用Spring注解开发(建议收藏)
❤️使用注解开发 在Spring4之后,要使用注解开发,必须保证aop的包导入了 使用注解开发需要导入context约束,增加注解的支持! <?xml version="1.0&quo ...
- Spring注解开发配置
applicationContext.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <bean ...
- springboot 调用方法事物_springboot中使用@Transactional注解事物不生效的坑
一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...
最新文章
- Webpack学习-工作原理(上)
- postgres 退出_centos如何退出postges?
- 【Leetcode | 1】93. 复原IP地址
- 给所有使用FMX(FireMonkey)进行开发的忠告!
- 《算法概论》第八章NP完全问题部分习题解
- 岩板铺地好吗_铺地的石板如何用处高逼格,三个大师案例来教你!
- 记录使用itextpdf通过定位插入图片和文字
- 计算机重启命令编码,电脑倒计时重启代码是什么
- 幼儿园作业(毕业季)
- 全自动反冲洗叠片过滤器
- c语言各种输出错误提示,C语言错误处理-输出错误信息
- 人工智能语言python培训
- Go入门-Go语言环境安装与GoLand第一个项目创建
- 联想领像L100D黑白激光打印机 评测
- USB2.0接口CM4_5G mini驱动板搭配广和通FM150在Win11下的测速
- 什么才是网络工程师?
- 五、MySQL主从复制原理
- getprop (dns)
- 「技术分享」汽车检测移动机器人应用,科聪赋能智能数字化检测!
- Office EXCEL 如何实现在单元格内换行