01.SpringBoot自动配置原理.pdf
点击查看【processon】
image.png

Spring的bean加载顺序

bean是否单列、懒加载
如何实现这个实例化bean的过程?
反射,通过class.newinstance()方法将bean加载到容器中
image.png

BeanDefinition

  • 描述一个bean的全部信息,比如他的class类型、Bean的作用域、是否懒加载…
  • spring中每一个被扫描到的bean都会生成一个BeanDefinition。
  • BeanDefinition的主要作用是为了在只解析一次类的情况下,最大程度的拿到这类的信息。防止重复解析导致效率变低。

    从Srpring的IOC到SpringBoot的自动配置原理

    springboot是一个脚手架
    EnableAutoConfiguration:开启自动配置功能,通过@Import导入DeferredImportSelector,去读取自动配置类(在所有jar包下的META-INF/spring.factories)返回List,spring就会把这些Bean放到Map里面去,再通过Beanfactory创建成最终的Bean到IOC中。
    @ConditionalOnXXX 中的所有条件都满足,该类才会生效。
    到这里可能面试官会问你:“spring.factories中这么多配置,每次启动都要全部加载么?
    这边会有筛选,会加载在xml中加的那些相关配置类

    DeferredImportSelector对Bean加载顺序的影响

    DeferredImportSelector和ImportSelector一个区别
    比如SqlsessionFactory加载完毕以后,我们需要自定义一个SqlsessionFactory实现我们需要的功能,达到延展性,而ImportSelector是实现不了的,不会覆盖新的SqlsessionFactory;DeferredImportSelector:会在spring解析了@import、@Component等所有注解以后再去解析DeferredImportSelector,如果你已经配置了Bean如下图,就会覆盖默认配置的SqlsessionFactory类。
    image.png
    特性:延时加载、分组
    在解析配置类时只是将其加入到一个容器中,等到所有的配置类都解析完成后才会处理DeferredImportSelector。

    总结

Spring Boot 通过@EnableAutoConfiguration开启自动装配,通过 SpringFactoriesLoader 最终加载META-INF/spring.factories中的自动配置类实现自动装配,自动配置类其实就是通过@Conditional按需加载的配置类,想要其生效必须引入spring-boot-starter-xxx包实现起步依赖