Spring Boot 自动装配原理

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 注解的三种用法

    1. 引入其他 @Configuration 类,类似 xml 中配置的,有利于划分不同的配置,满足配置的单一职责原则。

@Configuration 的作用

  • 允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
  • 配合 @ConfigurationProperties 读取配置信息
  1. 引入的其他 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

你可能感兴趣的:(Spring Boot 自动装配原理)