问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

SpringBoot自动装配原理详解

创作时间:
作者:
@小白创作中心

SpringBoot自动装配原理详解

引用
1
来源
1.
https://javaguide.cn/system-design/framework/spring/spring-boot-auto-assembly-principles.html

SpringBoot的自动装配机制是其核心特性之一,它极大地简化了Spring应用的配置过程。本文将深入解析SpringBoot的自动装配原理,包括其工作流程、关键注解的作用,以及如何创建自定义的Starter。

前言

使用过Spring的开发者,一定对XML配置文件印象深刻。即使Spring引入了基于注解的配置方式,但在开启某些Spring特性或引入第三方依赖时,仍需要进行显式配置。例如,在没有SpringBoot的情况下,创建一个RESTful Web服务需要如下配置:

@Configuration
public class RESTConfiguration {
    @Bean
    public View jsonTemplate() {
        MappingJackson2JsonView view = new MappingJackson2JsonView();
        view.setPrettyPrint(true);
        return view;
    }
    @Bean
    public ViewResolver viewResolver() {
        return new BeanNameViewResolver();
    }
}

而在Spring Boot项目中,我们只需要添加相关依赖,通过启动main方法即可:

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

这种便捷性得益于Spring Boot的自动装配机制。

什么是SpringBoot自动装配?

Spring Boot的自动装配机制允许开发者通过简单的注解或配置就能实现复杂的功能。这种机制的核心是通过扫描外部JAR包中的META-INF/spring.factories文件,加载其中定义的类型信息到Spring容器中。

自Spring Boot 3.0开始,自动配置包的路径已改为META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

SpringBoot是如何实现自动装配的?

SpringBoot的核心注解@SpringBootApplication包含了三个关键注解:@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan。其中,@EnableAutoConfiguration是实现自动装配的关键。

@EnableAutoConfiguration:实现自动装配的核心注解

@EnableAutoConfiguration通过AutoConfigurationImportSelector类实现自动装配的核心功能。这个类实现了ImportSelector接口,主要通过selectImports方法获取需要加载到IoC容器中的类。

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
    // ...
}

AutoConfigurationImportSelector:加载自动装配类

AutoConfigurationImportSelector类的selectImports方法主要负责加载自动配置类。该方法首先判断自动装配开关是否打开,然后获取所有需要装配的bean,并进行去重和条件过滤。

public String[] selectImports(AnnotationMetadata annotationMetadata) {
    if (!this.isEnabled(annotationMetadata)) {
        return NO_IMPORTS;
    } else {
        AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
        AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
        return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
    }
}

如何实现一个Starter

创建一个自定义的Starter需要以下几个步骤:

  1. 创建threadpool-spring-boot-starter工程
  2. 引入Spring Boot相关依赖
  3. 创建ThreadPoolAutoConfiguration
  4. 在工程的resources包下创建META-INF/spring.factories文件

例如,创建一个自定义线程池的Starter:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.threadpool.ThreadPoolAutoConfiguration

总结

Spring Boot通过@EnableAutoConfiguration开启自动装配,通过SpringFactoriesLoader加载META-INF/spring.factories中的自动配置类。这些自动配置类通过@Conditional注解按需加载,只有满足条件的配置才会被加载到Spring容器中。


© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号