配置优先级

五种配置方式

  1. application.properties
  2. application.yml
  3. application.yaml
  4. Java系统属性配置 -Dkey=value
  5. 命令行参数: –key=value

优先级:命令行参数 > 系统属性参数 > properties参数 > yml参数 > yaml参数

启动jar包时指定Java系统属性配置和命令行参数:

1
java -Dserver.port=9000 -jar XXXXX.jar --server.port=10010

Bean的管理

1. Bean的作用域配置

作用域 说明
singleton 容器内同名称的bean只有一个实例(单例)(默认)
prototype 每次使用该bean时会创建新的实例(非单例)
request 每个请求范围内会创建新的实例(web环境中,了解)
session 每个会话范围内会创建新的实例(web环境中,了解)
application 每个应用范围内会创建新的实例(web环境中,了解)
  • IOC容器中的bean默认使用的作用域:singleton (单例)
  • 实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性
  • 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)

2.管理第三方Bean对象

第三方Bean注入的两种方式:(使用第二种)

1
2
3
4
5
6
7
8
9
10
11
12
13
// 方式1:启动类声明
@SpringBootApplication
public class App {
@Bean
public ThirdPartyBean bean() { ... }
}

// 方式2:专用配置类
@Configuration
public class ThirdPartyConfig {
@Bean
public ThirdPartyBean bean(Dependency dep) { ... }
}
  • 通过@Bean注解的name 或 value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。
  • 如果第三方bean需要依赖其他bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。

SpringBoot工作原理

管理第三方Bean对象的时候,如果说这个包,它不在SpringBoot启动类同级目录或其子包下,那么如果不配置componScan注解,就扫描不到,但是一般不建议给第三方包配置这个扫描注解

第三方包的Bean管理常用方案:

  1. 在启动类中,@Import(普通类.class)
  2. 在启动类中,@Import(配置类.class)
  3. 在启动类中,@Import(ImportSelector接口实现类) 接口实现类重写selectImports()方法

上面三种方法的共同点,就是要对启动类进行操作,其实再封装一下,就只需要在启动类中加固定的注解就好了

自定义一个En接口,在接口上加上面三种注解中的一种,在启动类中直接加这个自定义注解就行了

1
2
3
4
5
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(MyImportSelector.class)//指定要导入哪些bean对象或配置类
public @interface EnableHeaderConfig {
}

原理分析

第一层: SpringBoot启动类上的注解:@SpringBootApplication

​ 这个注解中有三个元注解:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

第二层:

​ 1. 首先看 @SpringBootConfiguration 注解,这个注解中包含:(第三层)@Configuration 注解 也就是配置类注解,这也是 启动类 能直接注入Bean对象的原因

​ 2. 然后是 @EnableAutoConfiguration 注解,这个注解包含 (第三层)@Import 注解,导入了 ImportSelector接口实现类,重写了 selectImports()方法 ,在方法中调用 getAutoConfigurationEntry() 方法 ,此方法再调用getCandidateConfigurations() 方法获 取在配置文件中配置的所有自动配置类的集合

​ 最底层 getCandidateConfigurations 方法的功能:获取所有基于

​ META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中配置类的集合

​ 3. @ComponentScan 这个不必说,就是启动类能够扫描当前目录及子目录中注解的功能

状态注解:在自动配置类声明bean的时候,除了在方法上加了一个@Bean注解以外,还会经常用到一个注解,就是以Conditional开头的这一类的注解。以Conditional开头的这些注解都是条件装配的注解

  • @ConditionalOnClass:判断环境中有对应字节码文件,才注册bean到IOC容器。
  • @ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),才注册bean到IOC容器。
  • @ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。

自定义starter

目标:封装阿里云 OSS SDK,实现开箱即用的 Starter,用户只需引入依赖即可自动注入 AliyunOSSOperator

1. 创建 Starter 模块(依赖管理)

模块名aliyun-oss-spring-boot-starter
作用​:统一管理依赖,用户只需引入此 Starter。
关键步骤​:

  1. 初始化 Maven 项目

    • 选择 Spring Boot 版本(如 3.2.8),不勾选任何依赖。
    • 删除无关文件(如 src/main/java),仅保留 pom.xml
  2. 配置 pom.xml

    1
    2
    3
    4
    5
    6
    7
    8
    <dependencies>
    <!-- 引入 autoconfigure 模块 -->
    <dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    </dependency>
    </dependencies>

2. 创建 Autoconfigure 模块(核心逻辑)

模块名aliyun-oss-spring-boot-autoconfigure
作用​:实现自动配置逻辑,定义 Bean 和配置文件。

2.1 准备代码
  1. 拷贝原有工具类

    • AliyunOSSOperator(OSS 操作工具类)和 AliyunOSSProperties(配置类)复制到本模块。
    • 移除 @Component@Autowired(因为 Starter 需手动管理 Bean)。
  2. 改造 AliyunOSSOperator
    • 添加构造函数,接收 AliyunOSSProperties

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      public class AliyunOSSOperator {
      private final AliyunOSSProperties properties;

      // 必须提供构造函数(Spring 依赖注入用)
      public AliyunOSSOperator(AliyunOSSProperties properties) {
      this.properties = properties;
      }

      // 其他方法(upload/listFiles/deleteFile等)
      }
  3. 改造 AliyunOSSProperties
    • 添加 @ConfigurationProperties 绑定配置文件:

      1
      2
      3
      4
      5
      6
      7
      8
      @ConfigurationProperties(prefix = "aliyun.oss") // 绑定 yml 配置
      public class AliyunOSSProperties {
      private String endpoint;
      private String accessKeyId;
      private String accessKeySecret;
      private String bucketName;
      // getters/setters...
      }
2.2 定义自动配置类(相比于原来的类新增的,一个配置类)
  1. 创建 AliyunOSSAutoConfiguration
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Configuration
    @EnableConfigurationProperties(AliyunOSSProperties.class) // 启用配置绑定
    public class AliyunOSSAutoConfiguration {

    @Bean
    public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties properties) {
    // 通过构造函数注入配置
    return new AliyunOSSOperator(properties);
    }
    }
  2. 注册自动配置类

    resources/META-INF/spring/ 下创建文件:

    • 文件名:org.springframework.boot.autoconfigure.AutoConfiguration.imports
    • 内容 :com.aliyun.oss.AliyunOSSAutoConfiguration
2.3 配置依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<dependencies>
<!-- Spring Boot 基础依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<!-- 阿里云 OSS SDK -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>

<!-- Lombok(可选) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

3. 用户使用 Starter

3.1 引入依赖
1
2
3
4
5
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-oss-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
3.2 配置参数(application.yml
1
2
3
4
5
6
aliyun:
oss:
endpoint: https://oss-cn-hangzhou.aliyuncs.com
accessKeyId: your-key-id
accessKeySecret: your-key-secret
bucketName: your-bucket
3.3 直接注入使用
1
2
3
4
5
6
7
8
9
@Service
public class FileService {
@Autowired
private AliyunOSSOperator ossOperator; // 自动注入

public void uploadFile() {
ossOperator.upload(...); // 直接调用方法
}
}

关键问题解答

1. 为什么需要构造函数?
  • 原因:Spring 无法通过 @Component 自动实例化第三方类,需手动在 @Bean 方法中构造对象。
  • 解决:在 AliyunOSSOperator 中显式定义构造函数,供 AliyunOSSAutoConfiguration 调用。
2. 配置如何生效?
  • @EnableConfigurationPropertiesAliyunOSSProperties 注册为 Bean。
  • application.yml 中的配置通过 @ConfigurationProperties 绑定到 AliyunOSSProperties 对象。
3. 自动配置触发条件
  • AutoConfiguration.imports 文件告诉 Spring Boot 启动时加载 AliyunOSSAutoConfiguration
  • 用户无需手动 @Import 或扫描包。

总结

  1. 对于二者的 pom.xml :
模块 Starter(依赖入口) Autoconfigure(实现逻辑)
依赖内容 只依赖 autoconfigure 模块 依赖具体功能包(如阿里云SDK)
文件内容 仅保留 pom.xml 保留 src/ + pom.xml
必须修改项 添加对 autoconfigure 的依赖 添加阿里云OSS SDK等具体依赖
  1. 最难理解的地方:

    **AliyunOSSProperties**:

    • 通过 @EnableConfigurationProperties 直接在配置类中注册为 Bean

    **AliyunOSSOperator**:

    • 通过构造函数接收容器中的 AliyunOSSProperties Bean
    • 无需手动创建或注入,完全由 Spring 管理。