Spring Boot--自动配置原理

引言

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

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

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

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

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

如图: 在这里插入图片描述 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。 在这里插入图片描述 @SpringBootApplication是一个复合注解或派生注解,在@SpringBootApplication中有一个注解@EnableAutoConfiguration,翻译的话就是开启自动配置 @Configuration //表示这是一个配置类,也可以给容器中添加组件 在这里插入图片描述 我们查看@EnableAutoConfiguration注解 ,会发现他引入了个 类
AutoConfigurationImportSelector.class
在这里插入图片描述 进入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 文件 在这里插入图片描述 在这里插入图片描述 打开之后,这个@EnableAutoConfiguration注解通过@SpringBootApplication被间接的标记在了Spring Boot的启动类上。在SpringApplication.run(...)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。

end
  • 作者:yxl(联系作者)
  • 发表时间:2020-08-11 15:11
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论