Spring自定义配置属性类

以一个minio的配置类为例

首先,由于minio模块被很多微服务需要,因此封装了一个starter,当背的微服务需要的时候就进行引入。
以下是starter模块的结构图
在这里插入图片描述

一、spring.factories文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.heima.file.service.impl.MinIOFileStorageService

这行配置的意思是:

  • org.springframework.boot.autoconfigure.EnableAutoConfiguration 是一个键,用于标识这是一个自动配置类的注册条目。
  • com.heima.file.service.impl.MinIOFileStorageService 是一个自动配置类的全限定名,它应该用 @Configuration 注解标记,并且可能包含用 @Bean 注解标记的方法来定义一些 Bean。

当 Spring Boot 应用程序启动时,如果 spring.factories 文件中列出的类存在于类路径上,Spring Boot 的自动配置机制会激活这个类,并将其作为应用程序上下文的一部分。在这个例子中,如果 com.heima.file.service.impl.MinIOFileStorageService 类存在,Spring Boot 将加载它,并根据类中定义的 Bean 和条件注解(如 @ConditionalOnClass、@ConditionalOnMissingBean 等)来配置应用程序。

二、核心注解

1. @Import

在 Spring 框架中,@Import 注解用于将额外的类导入到当前上下文中,使得这些类能够被 Spring 上下文管理,例如创建 Bean 或进行依赖注入。当你在一个 Spring 组件(如 @Service、@Component 或 @Configuration 类)上使用 @Import 注解时,你指明的类会被 Spring 容器处理,就像它们在 XML 配置文件中或 @Configuration 类中用 @Bean 方法显式声明的一样。
由于MinIOFileStorageService被spring加载,因此MinIOConfig也会被加载。

@Slf4j
@Import(MinIOConfig.class)
public class MinIOFileStorageService implements FileStorageService {

    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinIOConfigProperties minIOConfigProperties;

    private final static String separator = "/";

    ......
}

2. @EnableConfigurationProperties

@Data
@Configuration
@EnableConfigurationProperties({MinIOConfigProperties.class})
//当引入FileStorageService接口时
//@ConditionalOnClass(FileStorageService.class)
public class MinIOConfig {

    @Autowired
    private MinIOConfigProperties minIOConfigProperties;

    @Bean
    public MinioClient buildMinioClient(){
        return MinioClient
                .builder()
                .credentials(minIOConfigProperties.getAccessKey(), minIOConfigProperties.getSecretKey())
                .endpoint(minIOConfigProperties.getEndpoint())
                .build();
    }
}

3. @ConfigurationProperties

@Data
@ConfigurationProperties(prefix = "minio")  // 文件上传 配置前缀file.oss
public class MinIOConfigProperties implements Serializable {

    private String accessKey;
    private String secretKey;
    private String bucket;
    private String endpoint;
    private String readPath;
}

4. 也可以不用上面的注解,用@Value代替@ConfigurationProperties

@Configuration
public class Tess4jConfig {

    @Value("${test4j.datapath:null}")
    private String test4jDatapath;

    @Value("${test4j.language:null}")
    private String language;

    @Bean
    public ITesseract iTesseract(){
        ITesseract iTesseract = new Tesseract();
        iTesseract.setDatapath(test4jDatapath);
        iTesseract.setLanguage(language);
        return iTesseract;
    }
}

三、其它微服务引入模块

  1. 导入模块
<dependency>
    <groupId>com.heima</groupId>
    <artifactId>heima-file-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
  1. bootstrap.yml增加配置属性
minio:
  accessKey: minio
  secretKey: minio123
  bucket: leadnews
  endpoint: http://192.168.200.131:9000
  readPath: http://192.168.200.131:9000
### Spring Boot 自定义配置属性 #### 创建自定义配置类 为了实现自定义配置,在`application.properties`或`application.yml`文件中添加特定前缀的键值对。例如,假设要配置数据库连接池的相关参数: ```properties myapp.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC myapp.datasource.username=root myapp.datasource.password=password ``` 这些配置项可以通过创建对应的Java配置类来映射并注入到应用程序中[^1]。 #### 添加配置处理器依赖 为了让IDE能够识别来自`.properties`文件中的占位符,并提供更好的开发体验(比如代码补全),可以在项目的`pom.xml`里加入如下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> ``` 此操作有助于提高编码效率以及减少错误的发生概率[^3]。 #### 编写实体类用于接收配置数据 接下来需要构建一个POJO对象用来承载上述配置信息。该类应标注`@ConfigurationProperties(prefix="myapp.datasource")`注解指定其关联的配置项前缀,并通过`@Component`将其注册为Spring容器管理下的bean实例以便后续使用。 ```java import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "myapp.datasource") public class DataSourceConfig { private String url; private String username; private String password; // Getters and Setters } ``` 当应用启动时,框架会自动读取相应的配置并将它们绑定至此类字段上[^2]。 #### 使用自定义配置 最后一步是在业务逻辑层调用已准备好的配置组件。只需简单地将目标Bean注入即可访问其中存储的各项设置值。 ```java @Service public class MyService { @Autowired private DataSourceConfig dataSourceConfig; public void printDataSourceInfo() { System.out.println("Database URL:" + dataSourceConfig.getUrl()); System.out.println("Username:" + dataSourceConfig.getUsername()); System.out.println("Password:" + dataSourceConfig.getPassword()); } } ``` 这样就完成了整个流程——从定义外部化配置直到实际运用的过程。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值