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 注入 答案在以下截图
-
@Import 注解的三种用法
- 引入其他 @Configuration 类,类似 xml 中配置的,有利于划分不同的配置,满足配置的单一职责原则。
@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