Spring boot 自动装配实现机制
-
一种猜测
使用了 spring 的 beanFactoryPostProcessors 或者 xxxxware ,在spring 启动阶段通过反射扫描注解对 bean 进行装配 (这是 bean 的实例化过程) -
SpringBoot 自动装配原理
主要借助@EnableAutoConfiguration 和@ComponentScan 注解
springboot 提供了很多 starter 来帮助自动装配某一具体功能的 jar,借助@EnableAutoConfiguration 注解实现spring bean 的自动装配。 -
@EnableAutoConfiguration
使用@Import 引入AutoConfigurationImportSelector, 在该 selector 中获取所有自动装配类名,然后读取 META-INF/spring.factories加载自动配置类 (新版本的 springboot 读取的配置文件有改动),找到里面EnableAutoConfiguration 配置项,按需要根据所需配置文件中的配置项(例如jdbc 需要的 url,driver,username 等) 完成 bean 的装配
ConfigurationClassPostProcessor#processConfigBeanDefinitions -》 ConfigurationClassParser#processImports -》 AutoConfigurationImportSelector#selectImports
-
一个疑问 - 有些bean 看起来并没有被component标记,但是仍然可以使用autowired注入
例如:JavaMailSender 本身并没有被 component 标记,怎么可以使用 autowired 注入
答案在以下截图
image.png
image.png -
@Import 注解的三种用法
- 引入其他 @Configuration 类,类似 xml 中配置的<import>,有利于划分不同的配置,满足配置的单一职责原则。
@Configuration 的作用
- 允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
- 配合 @ConfigurationProperties 读取配置信息
- 引入的其他 configuration 类中定义的@Bean 可以交给 Spring 管理,即可以使用 autowired 注入 - JavaMailSender 实例化就是用这种方式
TODO 直接引入一个 bean 到spring IOC容器中(初始化一个 bean)
TODO 指定实现ImportSelector的类,用于个性化加载- EnableAutoConfiguration 的实现方式
Autowired 和 Component 注解
@Autowired 是依赖注入的注解,意思是把已经交给 spring 管理的 bean 注入到当前 bean 中
@Component 是标记当前 bean 需要交给 spring 管理(自动装配)
Autowired 注解生效的原理 - AutowiredAnnotationBeanPostProcessor
其他注解
- @ControllerAdvice :注解定义全局异常处理类
- @ExceptionHandler :注解声明异常处理方法
Spring bean 加载顺序
:static block > constructor > @PostConstruct > CommandLineRunner / ApplicationRunner
网友评论