狂神 SpringBoot 自动装配原理初探

原理初探

自动配置

pom.xml

  • spring

pom.xml下有parent

image-20200910220111831

spring-boot-starter-parent下还有parent

image-20200910220329482

spring-boot-dependencies没有parent了,里面存放着各种东西的jar包

所以pom.xml中

  • spring-boot-dependencies :存放着核心依赖
  • 我们在写或者引入一些springBoot依赖的时候,不需要指定版本,就是因为有这些版本仓库

启动器

  • image-20200910223740449
  • 应该是没有显式
  • springboot会将所有的功能场景,都变成一个个启动器
  • 要使用什么功能只要找到对应的启动器就可以

主程序

@SpringBootApplication
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }

}

进入注解,里面两个核心注解

@SpringBootConfiguration  :  springboot的配置
    @Configuration  :spring配置类
    	@Component  :说明这也是一个spring的组件

@EnableAutoConfiguration  :  自动配置
    @AutoConfigurationPackage  :  自动配置包
    	@Import(AutoConfigurationPackages.Registrar.class)  : 导入选择器 包注册
    		AutoConfigurationPackages.Registrar
    			metadata  :元数据
    
    @Import(AutoConfigurationImportSelector.class)  :导入  自动配置导入选择器
    		List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
			获取候选的配置

获取候选的配置

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
   List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
         getBeanClassLoader());
    断言非空,“没有加载出META-INF下的spring.factories文件”
   	spring.factories是一个自动配置的核心文件
    
   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;
}

/**
	 * Return the class used by {@link SpringFactoriesLoader} to load configuration
	 * candidates.
	 * @return the factory class
	 */
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
    return EnableAutoConfiguration.class;
}
启动类下的所有资源被导入
@SpringBootApplication  : 标注这个类是一个springboot的应用:启动类下的所有资源被导入

断言非空,“没有加载出META-INF下的spring.factories文件”
spring.factories是一个自动配置的核心文件

image-20200910233408227

spring启动器,自动配置,META-INF目录下有个spring.factories核心文件

image-20200910233656503

所有的自动配置都在这了

image-20200910234618488探究如何加载

image-20200910234641303

Properties properties = PropertiesLoaderUtils.loadProperties(resource);
里面做的工作,将所有资源加载到配置类中

image-20200910234859230

FACTORIES_RESOURCE_LOCATION
工厂资源位置

image-20200910235030692

位置就是刚刚自动配置的位置

这么多自动配置不是全部都生效了的,是有部分没生效的,需要有相关的启动start才能生效

image-20200911002635572

没生效就会爆红

@ConditionalOnBean
这也是一个核心注解
会判断条件成立才会加载这个类

结论

springboot所有自动配置都是在启动的时候扫描并加载

所有的自动配置类都在spring-boot-autoconfigure-2.2.9.RELEASE.jar/META-INF/spring.factories

部分没生效,通过@ConditionalOnBean来判断条件是否满足,

只要导入对应的start,就有对应的启动器,自动装配才会生效,配置成功

  • springboot启动时,扫描spring.factories获取指定的值
  • 将自动配置的类导入容器,自动配置类生效,帮我们自动配置
  • 以前需要自动配置的东西,springboot帮忙完成
  • 整个javaEE,解决方案,自动配置的东西都在spring-boot-autoconfigure-2.2.9.RELEASE.jar包下
  • 把所有需要导入的组件,以类名的方式返回,这些组件将会被导入容器
  • 容器中名为xxxAutoConfiguration的文件,就是这些类给容器中导入了整个场景需要的所有组件
    • 里面一般有@Bean来进行自动配置
    • image-20200911003624650
    • image-20200911003842595
    • image-20200911003911665
  • 有了自动配置类,就免去了手动编写配置文件的工作

自动配置原理分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值