Spring-Boot 自动配置 原理分析

173 阅读2分钟

Spring-Boot 自动配置 原理分析

pom.xml

  • Spring-Boot-dependencies: ==核心依赖==在父工程里
<parent>
    <groupId>io.terminus.dalaran</groupId>
    <artifactId>dalaran-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>
  • 当我们写入或者引入依赖的时候,不需要制定版本,因为都在仓库中由==maven== 统一管理

启动器

  • Spring-Boot的启动场景
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
  • 比如 spring-boot-web-starter他会帮助我们自动导入web环境所有的依赖
  • Spring-Boot会将所有的功能场景变成一个个的启动器,所以当我们需要某个功能的时候,只需要找到对应的启动器==start==就行了

主程序

//此处为注解,标注这是一个SpringBoot类,删掉程序则不能运行
//获取类下所有的资源导入
@SpringBootApplication
public class HelloworldApplication {
   public static void main(String[] args) {
      //启动程序
      SpringApplication.run(HelloworldApplication.class, args);
   }
}

注解

@SpringBootConfiguration    //Springboot的配置
	@Configuration			//Spring配置类
	@Component				//说明这是一个Springle组件

@EnableAutoConfiguration    //自动配置
	@AutoConfigurationPackage	//自动导入包		 
		@Import({Registrar.class})	//自动导入注册器
    @Import({AutoConfigurationImportSelector.class})	//自动导入选择器
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);	//获取所有的配置

获取候选的配置

    protected AnnotationAttributes getAttributes(AnnotationMetadata metadata) {
        String name = this.getAnnotationClass().getName();
        AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(name, true));
        Assert.notNull(attributes, () -> {
            return "No auto-configuration attributes found. Is " + metadata.getClassName() + " annotated with " + ClassUtils.getShortName(name) + "?";
        });
        return attributes;
    }
  • ==META-INF/spring.factories.==自动配置的核心配置

SpringApplication类

它主要作用为以下四点:

推断应用是一个普通的项目还是一个web项目
查找并且加载所有可用初始化容器,并且设置到Initializers属性之中
找出所有的应用程序监听器,并且设置到listeners属性之中
推断并且设置main方法的定义类,找到运行的主类

小结

Springboot所有的自动配置都是在启动的时候扫面并且加载:spring.factories所有的自动配置类都在这里面了,但是不一定都会生效,必须要满足条件,导入了对应的start,这样就有了相应的启动器,等有了启动器之后才会生效,自动装配就成功了。

特点

  • springboot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值;
  • 将这些自动配置的类导入容器,自动配置就会生效,帮助我们进行自动配置;
  • 以前我们需要自动配置的东西,现在springboot都帮我们完成了;
  • 整合JavaEE,解决方法和自动配置的东西都在spring-boot-autoconfigure-2.2.0.RELEASE.jar这个包下;
  • 它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器之中;
  • 容器中也会存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些类容器中导入了这个场景需要的所有组件(并且自动配置),@Configuration,JavaConfig;
  • 有了自动配置类,免去了我们手动编写配置文件的工作。