07-SpringBoot自动配置深入

时间:2021-06-17 17:10:14   收藏:0   阅读:0

springboot自动配置原理深入

要点:springboot的核心配置类中的注解@SpringBootApplication,这是一个核心注解。该注解主要源代码如下

...
import ...
    
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited//这个以及上面三个注解是注解的标配,不需要管
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class<?>[] exclude() default {};
.......
}
可以看出,@SpringBootApplication注解是:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
	excludeFilters = {
    	@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}),
    	@Filter(type = FilterType.CUSTOM,classes ={AutoConfigurationExcludeFilter.class})
    }
)
这三个注解的组合注解,这些注解具体作用如下所示

技术图片

   ```yaml 
   #(candidate:(竞选或求职的)候选人,申请人; 投考者; 应试者; 参加考试的人; 被认定适合者; 被认定有某种结局者;)(attribute v.	把…归因于; 认为…是由于; 认为是…所为(或说、写、作);n.属性; 性质; 特征;)
   当进入到this.getCandidateConfigurations(annotationMetadata, attributes)方法中执行后(获取候选的配置),可以看到是通过获取spring的工厂类加载器(getSpringFactoriesLoaderFactoryClass())来完成的需要装配的组件类信息的获取,核心语句:
   List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
   进入loadFactoryNames方法中查看,如下
   ```

技术图片

技术图片

技术图片

技术图片

   就是说
   private static Map<String, List<String>> loadSpringFactories(ClassLoader classLoader)
   方法帮我们获取了所有应该装配的组件信息,是默认扫描整个项目的"META-INF/spring.factories"中获取这个文件,加载其中的信息。这主要的依赖加载进来的jar包中的"META-INF/spring.factories",有些jar包的META-INF目录下是没有spring.factories。
   	但是最核心的是spring-boot-autoconfigure-2.2.5.RELEASE.jar这个jar包中是有spring.factories
   我们点开其中的spring.factories,可以看到# Auto Configure注解下面的信息就是我们之前调试时,configurations集合中存储的,是囊括了所有场景的配置类,都是***AutoConfiguration结尾的。
       就是说是已经再配置文件中写死了的springboot一启动就加载的所有场景的配置类作为组件,然后这些配置类中又为各自场景所需要的组件进行组件装配配置。
       虽然130个场景的自动配置类在启动的时候默认加载,但是由于这些场景的所需包以及自动配置类中的的条件装配注解@Conditional限制了是否向容器中装配这些组件,所以最终会按需进行配置的。所以我们在容器中看不到不需要的类的组件

技术图片

技术图片

技术图片

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!