以一个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;
}
}
三、其它微服务引入模块
- 导入模块
<dependency>
<groupId>com.heima</groupId>
<artifactId>heima-file-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
- bootstrap.yml增加配置属性
minio:
accessKey: minio
secretKey: minio123
bucket: leadnews
endpoint: http://192.168.200.131:9000
readPath: http://192.168.200.131:9000