Springboot自动化配置原理

77 阅读2分钟

##SpringBoot自动化配置原理 一个注解 启动类上的SpringBootApplication注解,他是一个复合注解,内部由三个注解组成 @SpringBootConfinguration,@CommponenScan,,@EnableAutoConfiguration

1、@SpringBootConfinguration,底层是一个Configuration,表示启动类是一个配置类,可以在内部定义相关Bean;

2、@Component,表示组件扫描,默认会扫描启动类包下子包下Spring能识别的组件;

3、@EnableAutoConfiguration,底层是一个Import注解,该注解中导入AutoConfigurationImportSelector类, 该类中有一个selectImports方法会被调用,该方法最终会去加载 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中的内容,并筛选满足starter 和各种Conditional条件的全类名,封装成一份字符串数组加载到内存中。

##自定义starter 步骤:按照规范需要先定义两个模块:

  1. starter模块(进行依赖管理[把程序开发所需要的依赖都定义在starter起步依赖中])
  2. autoconfigure模块(自动配置)

1、定义一个xxx-boot-start模块 只负责管理依赖,不写代码 2、定义一个xxx-boot-autoconfiguration模块 1)完成功能代码 2)定义一个XxxAutoConfiguration类:完成bean的创建和注入 3)通过Spring自动化装配原理XxxAutoConfiguration类的初始化操作: 在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中添加 XxxAutoConfiguration的全类名。

案例:自定义阿里云OSS自动配置,实现自定义starter 步骤:

  • 第1步:创建自定义starter模块 aliyun-oss-spring-boot-starter(进行依赖管理)
    • 把阿里云OSS所有的依赖统一管理起来

//在pom.xml文件配置内容下

4.0.0 org.springframework.boot spring-boot-starter-parent 3.2.8

<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-oss-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>

<properties>
    <java.version>17</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>
  • 第2步:创建autoconfigure模块 aliyun-oss-spring-boot-autoconfigure
    • 在starter中引入autoconfigure (我们使用时只需要引入starter起步依赖即可) //该模块pom.xml文件内容如下

4.0.0 org.springframework.boot spring-boot-starter-parent 3.2.8

<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>

<properties>
    <java.version>17</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>
接下来需要在starter模块中引入autoconfigure模块,在starter模块的配置文件中引入pom依赖
  • 第3步:在autoconfigure模块aliyun-oss-spring-boot-autoconfigure中完成自动配置

将之前案例中阿里云OSS部分的代码拷贝到autoconfigure模块下,并要加入相关依赖 org.projectlombok lombok

    <!--阿里云OSS-->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>3.17.4</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
    <!-- no more than 2.3.3-->
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.3</version>
    </dependency>
  1. 定义一个自动配置类,在自动配置类中将所要配置的bean都提前配置好 定义一个自动配置类AliossAutoComfiguration,子自动配置类中声明AliOSSOperator的bean对象; @Configuration @EnableConfigurationProperties(AliyunOSSProperties.class) public class AliyunOSSAutoConfiguration {
@Bean
public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties aliyunOSSProperties) {
    return new AliyunOSSOperator(aliyunOSSProperties);
}

} AliOSSOperator的代码中需要增加一个有参构造,将AliyunOSSProperties对象传递给工具类。

  1. 定义配置文件,把自动配置类的全类名定义在配置文件(META-INF/spring/xxxx.imports)中 把AliyunOSSAutoConfiguration的全类名配置到配置文件中,配置文件新建,路径如下: 在 aliyun-oss-spring-boot-autoconfigure 模块中的resources下 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports