使用场景:
自动读取配置文件,然后自动初始化 bean 并注入 Spring 容器。 业务只需要引入包,然后在配置文件写上对应的配置,就可以在代码中使用自动注入的 bean 对象
1、创建工程:
1.1、创建一个 maven 工程:
xml 中引入 spring-boot-autoconfigure 依赖、以及项目自己需要的依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>ck-client-test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<clickhouse.version>0.3.2-patch8</clickhouse.version>
<spring.version>2.2.6.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>com.clickhouse</groupId>
<artifactId>clickhouse-client</artifactId>
<version>${clickhouse.version}</version>
</dependency>
<dependency>
<groupId>com.clickhouse</groupId>
<artifactId>clickhouse-http-client</artifactId>
<version>${clickhouse.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</project>
1.2、创建 Properties 类:
Properties 类可以封装 Spring 配置文件中的指定配置:
Spring 会自动进行对象转换 ```java @ConfigurationProperties(prefix = “clickhouse”) public class ClickHouseProperties {
private List
dataSources = new ArrayList<>(); public List
getDataSources() { return dataSources;
}
public void setDataSources(List<ClickHouseServer> dataSources) {
this.dataSources = dataSources;
}
}
```java
public class ClickHouseServer {
private String name;
private boolean isHttps = false;
private String host;
private int port = 8123;
private String database;
private String username;
private String password;
// getter 和 setter自行补充
}
1.3、创建 AutoConfiguration:
- 配置了开关,用于控制是否加载
- 注入配置类,获取需要的配置项
- 初始化需要的 Bean,使用 @Bean 注入到 Spring 容器中 ```java
// 开启配置 @Configuration // 开启使用映射实体对象 @EnableConfigurationProperties(ClickHouseProperties.class) // 存在对应配置信息时初始化该配置类 @ConditionalOnProperty( prefix = “clickhouse”, // 存在配置前缀 value = “enabled”, // 开启 matchIfMissing = false // 缺失检查。enabled 默认值为false ) public class CkAutoConfiguration {
private static final Log logger = LogFactory.getLog(CkAutoConfiguration.class);
// 注入配置文件类
@Autowired
private ClickHouseProperties clickHouseProperties;
// 这个类用于动态向 Spring 容器中注册 bean。这里暂时没用到,只是记录一下
@Autowired
DefaultListableBeanFactory defaultListableBeanFactory;
@Bean
@ConditionalOnMissingBeanrCkClientPool.class)
public CkClientPool CkClientPool() {
// 根据配置类,初始化对象
HashMap<String, CkClient> ckDataSources = new HashMap<>();
List<ClickHouseServer> dataSources = clickHouseProperties.getDataSources();
for (ClickHouseServer datasource : dataSources) {
CkClient ckClient = new CkClient();
ckClient.setHost(datasource.getHost());
logger.info("Init CkClient: " + datasource.getName());
ckDataSources.put(datasource.getName(), ckClient);
}
return new CkClientPool(Collections.unmodifiableMap(ckDataSources));
}
}
<a name="Q43HJ"></a>
### 1.4、启用 AutoConfiguration:
src/main/resources/META-INF/spring.factories:
```properties
# AutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.demojie.CkAutoConfiguration
同时可以创建配置的元数据文件,方便 IDE 自动提示:
- src/main/resources/META-INF/spring-configuration-metadata.json
这样其他人引入包后,在配置文件编写配置时就可以自动提示和自动补全了。
1.5、打包:
将这个 maven 工程安装到本地,这样其他工程就可以直接引用了
mvn clean install
2、使用:
2.1、新建 SpringBoot 工程,引入模块:
<dependency>
<groupId>org.example</groupId>
<artifactId>ck-client-test</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2.2、配置文件中创建配置:
clickhouse:
enabled: true
datasources:
- name: test1
host: aaa
port: 33333
username: xxxx
password: xxxx
- name: test2
host: aaa2
port: 333332
username: xxxx2
password: xxxx2
2.3、在代码中注入对应的类:
- 然后就可以在代码中自动注入对应的 bean 了 ```java
@Controller public class HelloControl { @Autowired private CkClientPool ckClientPool; } ```