使用场景:

自动读取配置文件,然后自动初始化 bean 并注入 Spring 容器。 业务只需要引入包,然后在配置文件写上对应的配置,就可以在代码中使用自动注入的 bean 对象

1、创建工程:

1.1、创建一个 maven 工程:

xml 中引入 spring-boot-autoconfigure 依赖、以及项目自己需要的依赖:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.example</groupId>
  7. <artifactId>ck-client-test</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <properties>
  10. <maven.compiler.source>11</maven.compiler.source>
  11. <maven.compiler.target>11</maven.compiler.target>
  12. <clickhouse.version>0.3.2-patch8</clickhouse.version>
  13. <spring.version>2.2.6.RELEASE</spring.version>
  14. </properties>
  15. <dependencies>
  16. <dependency>
  17. <groupId>com.clickhouse</groupId>
  18. <artifactId>clickhouse-client</artifactId>
  19. <version>${clickhouse.version}</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>com.clickhouse</groupId>
  23. <artifactId>clickhouse-http-client</artifactId>
  24. <version>${clickhouse.version}</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-autoconfigure</artifactId>
  29. <version>${spring.version}</version>
  30. </dependency>
  31. </dependencies>
  32. </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; } ```