SpringBoot 自动装配原理

Posted 闲言_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 自动装配原理相关的知识,希望对你有一定的参考价值。

1 pom.xml

  1. 核心依赖在父工程中
  2. spring-boot-dependencies
  3. 我们在引入一些Springboot依赖的时候,不需要版本,就是因为有这些版本仓库

1.1在pom.xml中点击 查看父工程

1.2这个父工程里面还有一个父工程

1.3这个parent里面没有 父工程了

1.4管理了大量的jar 包版本

1.5在Spring-boot-starter-parent中 配置了资源过滤,不需要我们去配置了。

2启动器

<dependencies>
    <!--启动器-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
</dependency>

  1.启动器:说白了就是SpringBoot的启动场景;

  2.比如:Spring-boot-starter-web,他就会帮助我们自动导入web环境所有的依赖!

  3.SpringBoot 会将所有的功能场景都变成一个个的启动器

3主程序

主程序就两个东西,一个注解和SpringApplication.run()

  1.@SpringBootApplication 标注这个类是一个Springboot的应用

  2.SpringApplication.run(DemoApplication.class, args); 将SpringBoot 应用启动,通过反射加载DemoApplication类的对象

表面意思

3.1注解

点进去它是一个组合注解

这个里面还有很多其他

1.@SpringBootConfiguration
  SpringBoot的配置
2.@EnableAutoConfiguration
  自动导入配置
3.@ComponentScan
  扫描包,去除哪些东西
4.@ConfigurationPropertiesScan
  配置扫描

@SpringBootConfiguration
点进去@SpringBootConfiguration

由一个configuration配置的

@Configuration :代表这个是一个Spring 配置类

说明启动类也是一个配置类

点进去@Configuration

发现它只有一个Component 注解,说明这也是Spring一个组件

3.2@EnableAutoConfiguration

自动导入配置
点进去

发现除了4个默认配置注解以外,还发现@AutoConfigurationPackage 自动配置包

@AutoConfigurationPackage  

点进去@AutoConfigurationPackage 注解`

发现导入选择器

@Import(AutoConfigurationPackages.Registrar.class)

点进AutoConfigurationPackages

//导入初始化的一些bean
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports 
//metadata 元数据
   @Override
   public void registerBeanDefinitions(AnnotationMetadata metadata,
         BeanDefinitionRegistry registry) 
  //PackageImport 导入元数据           
      register(registry, new PackageImport(metadata).getPackageName());
   

   @Override
   public Set<Object> determineImports(AnnotationMetadata metadata) 
      return Collections.singleton(new PackageImport(metadata));
   


回到@EnableAutoConfiguration 注解

查看另一个注解 @Import(AutoConfigurationImportSelector.class) 自动配置导入选择

@Import(AutoConfigurationImportSelector.class)

点进AutoConfigurationImportSelector 看看

看到AutoConfigurationImportSelector 类中选择组件的方法

public String[] selectImports(AnnotationMetadata annotationMetadata) 

选择组件:就是选择哪些我们配置的pom.xml中的东西

点进loadMetadata

来到 AutoConfigurationMetadataLoader类的方法

回到AutoConfigurationImportSelector

  • 继续分析 selectImports 方法
  • getCandidateConfigurations 获取所有的配置
List<String> configurations = getCandidateConfigurations(annotationMetadata,
      attributes);

  • 核心方法
  • getCandidateConfigurations 获取候选的配置
  • loadFactoryNames 首先通过加载器加载所有的
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
      AnnotationAttributes attributes) 
   List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
         getSpringFactoriesLoaderFactoryClass(), 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;

@SpringBootApplication 注解标注了 @EnableAutoConfiguration

说明一件事
@SpringBootApplication : 标注这个类是一个SpringBoot 的应用:启动类下的所有资源被导入

继续看getCandidateConfigurations 方法

  1. 这个配置不为空
  2. META-INF/spring.factories
  3. 自动配置的核心文件

查看spring.factories文件

spring.factories 文件内容

  1. Initializers 初始化的
  2. Application Listeners 监听的
  3. Auto Configuration Import Listeners 自动选择导入的包
  4. Auto Configuration Import Filters
  5. Auto Configure 自动配置
  6. Failure analyzers
  7. Template availability providers

查看spring.factories 文件中的WebMvcAutoConfiuration

WebMvcAutoConfiuration类

WebMvcProperties 类

spring.factories 文件从哪来?
 &emspl先读了配置文件,才找到配置类

继续看getCandidateConfigurations 方法
点进去

来到springFactoriesLoader
查看loadSpringFactories方法

loadSpringFactories方法 可以看到springboot 把所有的资源都加载到配置类中

Properties properties = PropertiesLoaderUtils.loadProperties(resource);

点击 FACTORIES_RESOURCE_LOCATION 常量

加载了spring.factories 文件的所有东西


4结论:

  1. SpringBoot所有的自动配置都是在启动的时候扫描并加载;
  2. 所有的自动配置类都在这里面 spring.factories
  3. 但是不一定生效,要判断条件是否成立
  4. 只有导入了对应的start,就有对应的启动器了
  5. 有了启动器,我们自动装配就会生效,然后就配置成功了!

  1. Springboot 启动的时候,从类路径下/META-INF/spring.factories 获取指定的值
  2. 将这些自动配置类导入容器,自动配置就会生效,帮我进行自动配置
  3. 以前我们需要自动配置的东西,Springboot帮我们做了
  4. 整合Java2E ,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.5.RELEASE.jar 这个包下
  5. 它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器
  6. 容器中也会存在非常多的xxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件 @Configuration,JavaConfig!
  7. 有了自动配置类,免去我们手动编写配置文件的工作

以上是关于SpringBoot 自动装配原理的主要内容,如果未能解决你的问题,请参考以下文章

spring boot自动装配原理

SpringBoot学习探究Springboot自动装配

SpringBoot自动装配原理

SpringBoot - 自动装配原理

Springboot自动装配的原理

springboot自动装配原理(雷神)