SpringBoot自动装配原理分析

本文深入探讨SpringBoot自动装配原理,从依赖管理、主程序类的@SpringBootApplication注解到自动配置类的生效条件,解析SpringApplication.run()流程,揭示如何通过条件注解决定配置类是否生效,以及如何查看生效的自动配置类。
摘要由CSDN通过智能技术生成

1.原理初探

1.1.依赖(pom.xml)

1.1.1.spring-boot-dependencies

①.核心依赖,它是spring-boot-starter-parent父项目的父项目!

②.在该依赖中声明了后期可能要在springboot项目中使用的组件的版本号,所以后期引入这些组件依赖的时候就不需要再指定对应的版本号了!


1.1.2.启动器Starter

①.即SpringBoot的启动场景,可以帮我们自动导入使用某个组件所需要的依赖;

  • spring-boot-starter:spring-boot场景启动器

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    
  • 例如spring-boot-starter-web,他就会帮我们自动导入web环境所有的依赖;

②.SpringBoot的核心就是SpringBoot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter启动器,那么相关场景的所有依赖都会导入进来,要用什么功能就导入什么场景的启动器;


1.2.主程序类/启动类/主配置类

@SpringBootApplication  //该注解标注这个类是一个springboot应用
public class SpringbootApp {
   
    public static void main(String[] args) {
   
        //将springboot应用启动,通过反射机制加载当前类的对象
        SpringApplication.run(SpringbootApp.class);
    }
}

1.2.1.@SpringBootApplication注解

①.说明

SpringBoot应用中标注在某个类上说明这个类是SpringBoot的主配置类/启动类,SpringBoot就可以运行这个类的main方法来启动SpringBoot应用;

②.代码实现

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration  //SpringBoot的配置类,标注在某个类上,表示这是一个SpringBoot的配置类;
@EnableAutoConfiguration   //开启自动配置功能;当我们需要配置的属性,SpringBoot会帮我们自动配置;@EnableAutoConfiguration注解告诉SpringBoot开启自动配置功能,这样自动配置才能生效;
@ComponentScan(excludeFilters = {
    @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })     //扫描当前主启动类同级的包下面的组件
public @interface SpringBootApplication {
   
    //省略...
}

③.@SpringBootConfiguration注解

  • @SpringBootConfiguration注解代码实现

    @Target({
         ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Configuration   //配置类上来标注这个注解
    public @interface SpringBootConfiguration {
         
    }
    
  • @Configuration注解代码实现

    @Target({
         ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component  //配置类--配置文件;配置类也是容器中的一个组件;
    public @interface Configuration {
         
        @AliasFor(
            annotation = Component.class
        )
        String value() default "";
    }
    

④.@EnableAutoConfiguration注解

  • @EnableAutoConfiguration注解代码实现

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage  //自动配置包
    @Import(AutoConfigurationImportSelector.class)  //给容器中导入组件,AutoConfigurationImportSelector是导入组件的选择器;将所有需要导入的组件以全类名的方式返回,之后这些组件就会被添加到容器中;最终会给容器中导入非常多的自动配置类(xxxAutoConfiguration),也就是给容器中导入这个场景需要的所有组件,并配置好这些组件;
    public @interface EnableAutoConfiguration {
         
       //省略...
    }
    
  • @AutoConfigurationPackage注解注解代码实现

    @Import(AutoConfigurationPackages.Registrar.class)   //Spring的底层注解@Import,给容器中导入一个组件,导入的组件有AutoConfigurationPackages.Registrar.class,将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件注册到Spring容器中;
    public @interface AutoConfigurationPackage {
         
        //省略...
    }
    
  • AutoConfigurationImportSelector#selectImports()

    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
         
    		if (!isEnabled(annotationMetadata)) {
         
    			return NO_IMPORTS;
    		}
    		AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
    				.loadMetadata(this.beanClassLoader);
    		AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
    				annotationMetadata);
    		return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
    }
    
    
    
    protected AutoConfigurationEnt
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值