返回
Featured image of post Spring Boot 自动装配原理

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 注入 答案在以下截图

  • @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

Built with Hugo
Theme Stack designed by Jimmy