SpringBoot自动装配机制

自动装配简单来说就是自动把第三方组件的bean加到IOC容器里,在springboot项目中可以通过在启动类上加@springbootapplication注解来实现自动装配,这个注解是一个组合注解,真正实现自动装配的注解是@EnableAutoConfiguration。

自动装配主要依靠三个核心的关键技术:
        第一个引入Starter,启动依赖组件的时候,这个组件必须要包含一个@Configuration配置类。而在这个配置类里面,我们需要通过@Bean这个注解,去声明需要装配到IOC容器里面的Bean对象。
        第二个,这个配置类是放在第三方jar包里面,如何通过SpringBoot中的约定优于配置的一个理念,去把这个配置类的全路径,放在classpath:META-INF/spring.factories文件里面,这样的话,SpringBoot就可以知道第三方jar包里面这个配置类的位置。这个步骤主要是用到Spring里面的SpringFactoriesLoader 来完成的。
        第三个,SpringBoot拿到所有第三方jar包里面声明的配置类以后,再通过Spring提供的ImportSelector这样的一个接口,来实现对这些配置类的动态加载,从而去完成自动装配这样一个动作。

1.启动类的main方法中,调用了类SpringApplication中的一个run()方法,这个run()方法的主要作用是去加载启动类。
    (1)在类SpringApplication中的第一个run()方法,把参数传了进去。
    (2)而这个run()方法,创建了一个SpringApplication对象,然后又调用了另外一个run方法。
    (3)而这第三个run()方法refreshContext(ConfigurableApplicationContext context)拿到配置类,然后去解析配置类,主要是解析配置类上的注解@SpringBootApplication

2、注解@SpringBootApplication,包含了很多个注解
    (1)注解@SpringBootConfiguration
        本质上,它是一个配置类
    (2)注解@ComponentScan
        它的作用是扫描当前包及其子包(这也是为什么有时我们把启动类放错位置,而导致无法扫描到某些包的原因)
    (3)注解@EnableAutoConfiguration
        它是自动装配的注解,通过引入的依赖来自动添加配置
        进入loadFactoryNames()方法,获取资源,并且完成资源文件spring-factories的读取

    (4)SpringBootApplication一共做了三件事:
        1)声明是个配置类
        2)开启自动配置
        3)扫描包。
        
总结:自动装配的流程
    1、main方法中SpringApplication.run(xxx.class,args)的执行流程中有refreshContext(context)。
    2、而这个refreshContext(context)内部会解析,配置类上自动装配功能的注解@EnableAutoConfiguration中的引入类AutoConfigurationImportSelector。
    3、AutoConfigurationImportSelector这个类中的方法SpringFactoriesLoader.loadFactoryNames会读取jar包中的/项目中的META-INF/spring.factories文件。
    4、spring.factories配置了自动装配的类,最后根据配置类的条件,自动装配Bean。

你可能感兴趣的:(java,spring,spring,boot)