springboot自动配置原理
查看@SpringBootApplication的声明
查看@EnableAutoConfiguration的声明
自动配置的核心是@Import(AutoConfigurationImportSelector.class),AutoConfigurationImportSelector类中的selectImports方法
下述文件里面写死了spring-boot一启动就要给容器中加载的所有配置类,,即xxxxAutoConfiguration
spring.factories文件中的类不是会被全部加载的,它是根据当前满足的条件进行过滤的。
以WebMvcAutoConfiguration为例,该自动配置类想要生效必须满足下述条件@ConditionalXxxx
//标注当前是一个配置类,而且不使用代理(每次返回的都是不同的bean实例)
@Configuration(proxyBeanMethods = false)
//想要当前配置生效,必须有servlet的运行环境
@ConditionalOnWebApplication(type = Type.SERVLET)
//想要当前配置生效,必须有Servlet、DispatcherServlet、WebMvcConfigurer这几个类
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
//想要当前配置生效,容器中不能存在指定WebMvcConfigurationSupport类型的Bean;
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
//设置自动配置执行的优先级
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
//当前配置加载后,之后需要进行的操作
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
当满足上述所属的条件时,WebMvcAutoConfiguration才会被加载。其中,@ConditionalOnBean(当前类名.class)注解,满足了用户自定义的配置优先于speingboot底层默认的配置,被该注解标注后,表明只有注解属性中对应的类型的bean不存在时,该配置类才加载。
总结:
-
SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
-
每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定(xxxProperties类中的属性值,在配置文件中取)
-
生效的配置类就会给容器中装配很多组件
-
只要容器中有这些组件,相当于这些功能就有了
-
修改配置的方式
- 用户直接自己@Bean替换底层的组件(自定义的优先于默认的)
- 用户去看这个组件是获取的配置文件什么值就去修改(在application.properties、application.yml中)。修改方式:查看官方文档或者查看源码,找到对应的prefix
就去修改(在application.properties、application.yml中)。修改方式:查看官方文档或者查看源码,找到对应的prefix