Spring Boot--自动配置原理

引言

作为Spring Boot的精髓,自动配置原理的工作过程往往只有在“面试”的时候才能用得上,但是如果在工作中你能够深入的理解Spring Boot的自动配置原理,将无往不利。

Spring Boot的出现,得益于“习惯优于配置”的理念,没有繁琐的配置、难以集成的内容(大多数流行第三方技术都被集成),这是基于Spring 4.x提供的按条件配置Bean的能力。

springboot的配置文件 :application.properties 或 application.yml

示例:
Spring Boot--自动配置原理_第1张图片
那么问题来了:这些配置是如何在Spring Boot项目中生效的呢?那么接下来,就需要聚焦本篇博客的主题:自动配置工作原理或者叫实现方式。

Spring Boot关于自动配置的源码在spring-boot-autoconfigure-x.x.x.x.jar中:

如图:
Spring Boot--自动配置原理_第2张图片
Spring Boot的启动类上有一个@SpringBootApplication注解,这个注解是Spring Boot项目必不可少的注解,也是springboot自动配置的核心

1.@Configuration的注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。

2、@EnableAutoConfiguration:能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。

3、@ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。
Spring Boot--自动配置原理_第3张图片
@SpringBootApplication是一个复合注解或派生注解,在@SpringBootApplication中有一个注解@EnableAutoConfiguration,翻译的话就是开启自动配置
@Configuration //表示这是一个配置类,也可以给容器中添加组件

Spring Boot--自动配置原理_第4张图片
我们查看@EnableAutoConfiguration注解 ,会发现他引入了个 类
AutoConfigurationImportSelector.class

Spring Boot--自动配置原理_第5张图片
进入AutoConfigurationImportSelector类中,我们会发现 有这个方法 如图

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
     
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

出现报错 从中我们可以推出 @EnableAutoConfiguration注解 如何自动装配了
“No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.”
翻译:
在META-INF/spring.factories中找不到自动配置类。如果使用自定义打包,请确保文件正确无误。

在保重我们找到的了对应的spring.factories 文件
Spring Boot--自动配置原理_第6张图片
Spring Boot--自动配置原理_第7张图片
打开之后,这个@EnableAutoConfiguration注解通过@SpringBootApplication被间接的标记在了Spring Boot的启动类上。在SpringApplication.run(…)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。

你可能感兴趣的:(框架)