自动配置原理笔记

自动配置原理:

1、SpringBoot启动时加载主配置类,开启自动配置功能@EnableAutoConfiguration

2、@EnableAutoConfiguration作用:

-利用EnableAutoConfigurationImportSelector.class给容器中导入一些组件

-EnableAutoConfigurationImportSelector.class中selectImports()方法的内容(获取候选配置):           

List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);

-getCandidateConfigurations()方法内容是:

List<String> configurations = SpringFactoriesLoader.loadFactoryNames()
//扫描所有jar包类路径下META-INF/spring.factories
//把扫描到的这些文件的内容包装成properties对象
//从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把它们添加到容器中

总的来说就是将所有jar包类路径下META-INF/spring.factories里面配置的EnableAutoConfiguration的值加入容器中。每个jar包下的EnableAutoConfiguration下面的xxxAutoConfiguration类都是容器中的一个组件,被加入到容器中,用他们来进行自动配置。

3、每一个自动配置类(xxxAutoConfiguration)进行自动配置功能

4、以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(ServerProperties.class)    //将配置文件中对应的值和HttpEncodeingProperties类绑定起来,并加入到ioc容器中
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)    //Spring底层@Conditional注解:只有满足指定的条件,整个配置类中的配置才会生效;这里是判断当前是否是web应用
@ConditionalOnClass(CharacterEncodingFilter.class)    //判断当前项目有没有这个类,CharacterEncodingFilter.class:SpringMVC中进行乱码解决的过滤器
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)    //判断配置文件中是否存在某个配置 spring.http.encoding.enable;即使没有配,也认为属性的值为true
public class HttpEncodingAutoConfiguration {
   
   

根据当前不同的判断条件,决定这个自动配置类是否生效?

一旦这个配置类生效:这个配置类就会给容器中添加各种组件,组件的属性是从对应的properties类中获取的,这类里面的每一个属性又是和配置文件绑定的。

5、所有在配置文件中能配置的属性都是在xxxProperties类(@EnableConfigurationProperties(xxxxProperties.class,这个属性类中通过@ConfigurationProperties注解绑定了相应的属性文件中的属性))中封装着;配置文件能配置什么就可以参照某个功能对应的这个属性类(xxxProperties.class)。

总结:

  1. SpringBoot会加载大量的自动配置类
  2. 查看需要的功能是否有SpringBoot默认写好的自动配置类
  3. 查看自动配置类中配置了哪些组件
  4. 自动配置类给容器中添加组件的时候,会从xxxProperties类中获取某些属性,可以在配置文件中指定这些属性的值

猜你喜欢

转载自blog.csdn.net/Nemoosi/article/details/107807544