SpringBoot自动装配

1. @SpringBootApplication注解

SpringBoot自动装配发生在@SpringBootApplication注解,那@SpringBootApplication由哪几部分组成?
查看源码:


image.png

这里面包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan,此处@ComponentScan由于没有指定扫描包,因此它默认扫描的是与该类同级的类或者同级包下的所有类,另外@SpringBootConfiguration,通过源码得知它是一个@Configuration。由此我们可以推断出@SpringBootApplication等同于@Configuration @ComponentScan @EnableAutoConfiguration

  • Configuration:将一个类申明为一个IoC容器配置类,该类中任何标注了@Bean的方法,它的返回值都会作为Bean定义注册到Spring容器中,方法名默认称为这个Bean的id
  • ComPonentScan:默认扫描当前包及其子包下的被@Component、@Repository、@Service、@Controller标识的类到IoC容器中
  • EnableAutoConfiguration:帮助springboot将所有符合条件的configuration配置加载到springboot创建的IoC容器中。其实这里借助了spring框架提供的一个工具类:SpringFactoriesLoader的支持,以及用到了spring提供的条件注解Conditional。我们发现它有一个Import注解,那么这个注解是干嘛的呢?
    • 基于普通的Bean或者带有Configuration注解的Bean进行注入
    • 实现ImportSelector接口进行动态注入
    • 实现ImportBeanDefinitionRegistrar接口进行动态注入

2. 自动装配

ComPonentScan找到了需要装配的bean,加载到Spring的IOC容器中;EnableAutoConfiguration上有个Import注解,这个注解里面包含了一个实现了ImportSelector的类,在它里面的selectImports方法可以选择注入需要的Bean。从源码可以看到过程:

  1. 扫描META-INF/spring-autoconfigure-metadata.properties文件,它里面定义了很多的Conditional条件,例如ConditionalOnClass
  2. 扫描META-INF/spring.factories,结合前面扫描到的进行过滤,原因是很多@Configuration其实是依托于其它的框架来加载的,如果当前classpath下没有相关的依赖,则意味着这些类没必要加载,所以通过这种条件过滤可以有效的减少@Configuration类的数量从而降低启动时间。
  • 自动装配还是利用了SpringFactoriesLoader来加载META-INF/spring.factoires文件里所有配置的EnableAutoConfgruation,它会经过exclude和filter等操作,最终确定要装配的类
  • 处理@Configuration的核心还是ConfigurationClassPostProcessor,这个类实现了BeanFactoryPostProcessor, 因此当AbstractApplicationContext执行refresh方法里的invokeBeanFactoryPostProcessors(beanFactory)方法时会执行自动装配

参考文章:https://www.cnblogs.com/niechen/p/9027804.html
https://www.cnblogs.com/gaojf/p/12941944.html

你可能感兴趣的:(SpringBoot自动装配)