springboot自动装配原理学习笔记

springboot自动装配原理学习笔记

IoC控制反转

实际上就是把对象的生命周期托管到Spring容器中,反转指对象的获取方式反转了。

使用Spring IoC容器之后,客户端类不需要再通过new创建对象,直接从容器中获取。

 

IoC容器中的对象构建

IoC容器中的对象在早期的spring中,是通过xml配置bean,spring解析xml来装载到容器;

Springboot则是通过自动装配来实现(后文会讲)。

 

DI依赖注入

IoC容器在运行期间,动态的把某种依赖关系注入到组件;

要实现依赖注入,之前有三种方式:接口注入、构造方法注入、setter方法注入,现在通常是通过注解的方式,@Resource等,但本质上都是描述bean之间的依赖关系;

 

Bean的装配方式

配置形式的变化

  • 早期是基于xml来描述bean之间的关系,spring3之后出现了JavaConfig,只需要通过@Configuration注解达到xml等效的效果;

Bean装载方式的变化

  • 早期基于xml配置装载 id class,JavaConfig出现通过@Configuration 和@Bean的形式注入IoC容器;

依赖注入的变化

  • 早期在xml中配置 bean property,JavaConfig出现后在@Configuration注解的配置类中,使用@Bean配置多个bean和其对应关系;

不过这两者任然存在问题,依赖过多版本兼容问题,配置过多繁琐;

 

Springboot中约定大于配置

  1. Maven目录结构的约定 src、main、test等;
  2. 配置文件application.开头;
  3. 自动依赖内置的Tomcat容器;
  4. Starter组件自动装配;

 

自动装配

自动将Bean装配到IoC容器;

自动装配也是Starter组件的基础;

在使用SpringMVC构建一个web项目的时候,需要在web.xml中配置控制器,配置spring的xml文件或JavaConfig,Springboot则是由Starter组件及自动装配来完成装配的;

只在pom中添加了一个Starter依赖,是如何完成依赖组件相关Bean的自动装配的?

基于约定,Springboot通过@EnableAutoConfiguration开启自动装配。详情如下:

@Enable

而关于@Enable开头的注解(还有@EnableWebMvc、@EnableScheduling、@EnableAsync等等),之前也提到了,基于JavaConfig的形式来装载Bean,必须用@Configuration和@Bean两个注解配合,而@Enable注解本质是对这两个注解的封装。@Enable的注解中都有个@Import注解,这里导入了相应的配置类,spring解析到这个配置类之后就会根据配置类的描述来装配Bean。

再回到@EnableAutoConfiguration注解,它里面还包含了一个@AutoConfigurationPackage注解,这个注解的目的就是把使用了该注解的类所在包及子包下所有组件扫描到IoC容器。而@EnableAutoConfiguration注解中的@Import注解导入的类并不是一个@Configuration注解的配置类,而是AutoConfigurationImportSelector类。springboot自动装配原理学习笔记

AutoConfigurationImportSelector

这个类实现了ImpotSelector接口,它只有一个selectImports抽象方法springboot自动装配原理学习笔记

这个方法会返回一个数组,数组中是指定需要装配到IoC容器的类。当在@Import导入一个ImportSelector实现类之后,会把该实现类返回的Class名称都装载到IoC容器。

这个实现方式和其他Enable注解中@Import导入的@Configuration注解的类比起来,更加灵活,而且能批量装配。

最后,关于自动装配的原理,总结如下:

  1. 通过@EnableAutoConfiguration开启自动装配,@Import(AutoConfigurationImportSelector)导入配置类(和其他@Configuration注解的配置类不同);
  2. AutoConfigurationImportSelector实现了ImportSelector接口,重写selectImports方法,实现选择性批量配置类的装配;
  3. 通过Spring的SpringFactoriesLoader机制,扫描classpath路径下的META-INF/spring.factories,读取需要实现自动装配的配置类;
  4. 通过条件筛选,移除不符合的配置类,完成自动装配。

 

参考资料《SpringcloudAlibaba微服务原理实战》