SpringBoot自动装配以及原理
-
Spring支持两种bean的配置方式,xml和javaConfig
-
启动类上@SpringbootApplication注解是组合注解,其中有三个主要的注解 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
@SpringBootConfiguration
- 作用:声明定义Bean,嵌套了@Component组件
- @SpringBootConfiguration注解源码是@Configuration,表示该类为主配置类,可用来装配bean。
- @Configuration的注解源码是Component,说明spring的配置类也是Springb的一个组件。
- 它是以javaConfig形式的基于spring IOC容器的配置类使用的一种注解。SpringBoot实质上就是一个spring的应用,通过这个注解来加载IOC容器的配置。所以说启动类里面标注了@Configuration注解,意味着它也是一个IOC容器的配置类。
@ComponentScan
- 作用:扫描主配置类包下所有类。
@EnableAutoConfiguration
- 作用:
开启自动装配类
@EnableAutoConfiguration注解是一个组合注解,@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})
1、@AutoConfigurationPackage
- 表示自动配置包
- 作用:给Spring容器中导入一个Registrar注册器组件
@AutoConfigurationPackage和@ComponentScan一样,也是将主配置类所在的包以及子包里面的组件扫描到IOC容器中,但是区别是
@AutoConfigurationPackage扫描@Enitity、@MapperScan等第三方依赖的注解。
@ComponentScan只扫描@Controller、@Service、@Component、@Repository这些常见注解。所以说这俩注解的对象是不一样的。
2、@Import({AutoConfigurationImportSelector.class})
-
作用:通过@Import导入第三方提供的bean的配置类:AutoConfigurationImportSelector,给容器中导入组件。
-
该类中有一个selec他Import方法
-
作用:扫描所有jar包类路径下的META-INF/spring.factories文件,将扫描道德这些文件包装秤properties对象,从properties中获取到EnableAutoConfiguration.class类名对应的值,将这些值添加到容器中,用这些类做到自动配置功能,在spring-boot-autoconfigure-jar包中找到spring.factories文件,其中spring.factories文件是一组组的key=value的形式。
其中以HttpEncodingAutoConfiguration为例解释:
@Configucation——表示该类为配置类
@EnableConfigurationProperties(ServerProperties.class)——能够将配置文件与指定的配置类做关联进行属性值绑定并将组件添加到IOC容器中。
将配置文件中设置的值与properties中的属性绑定,并将组件添加到IOC容器中。
其中ServerProperties.class中的属性,可与xx.yaml配置文件绑定并修改。
精髓:根据当前的配置类的条件判断是否生效,若生效则添加各种组件,会从properties类中获取属性,可以在配置文件中设置属性值。
- Properties类:封装配置文件的相关属性。
- AutoConfiguration类:自动配置类,添加到IOC容器中。
SpringFactoriesLoader
- 作用:从classpath/META-INF/spring.factories文件中,根据key来加载对应的类到IOC容器中。
自动装配的过程
1、通过各种注解的方式实现类与类之间的依赖关系,容器在启动的时候SpringApplication.run(),调用了EnableAutoConfigurationImportSelector.class的selectImports方法。
2、selectImporys方法调用了SpringFactoriesLoader.loadFactoryNames方法扫描jar包类路径下的META-INF/spring.factories文件下获取BEANConfiguration列表。
3、loadFactoryNames方法会读取spring.factoris文件中EnableAutoConfiguration.class类对应的值。
4、根据类上的注解判断,若符合条件则改配置类生效,将配置文件中的属性值配置到对应的配置类中,最后注入到IOC容器中实现自动配置。
总结:Springboot启动的时候通过@EnableAutoConfiguration注解找到META-INF/spring.factories文件中的所有自动配置类并对其加载,这些自动配置类都是以AutoConfiguration结尾来命名的。它实际上是一个javaConfig型式的IOC容器配置类,通过Properies结尾命名的类中取得全局配置文件中的配置属性,如server.port。