@ConfigurationProperties
案例代码:
@Data
@ConfigurationProperties(prefix = "spring.httpclient")
public class HttpClientProperties {
private Integer connectTimeOut=1000;
private Integer socketTimeOut=10000;
private String agent="agent";
private Integer maxConnPerRoute=10;
private Integer maxConnTotal=50;
}
看到这个注解,首先需要想到肯定跟配置文件有关,然后配置文件里存在以“spring.httpclient”开头的属性。
查看配置文件,确实存在这些属性:
spring.httpclient.connectTimeOut=100
spring.httpclient.socketTimeOut=10000
spring.httpclient.agent=agent
spring.httpclient.maxConnPerRoute=10
spring.httpclient.maxConnTotal=50
@ConfigurationProperties的作用就是将配置文件里的属性值映射到被注解的类里面。
@EnableConfigurationProperties
案例代码:
@Configuration
//HttpClient.java存在的情况下,才加载HttpClientAutoConfiguration
@ConditionalOnClass(HttpClient.class)
//将HttpClientProperties作为一个bean注入spring容器中
@EnableConfigurationProperties(HttpClientProperties.class)
public class HttpClientAutoConfiguration {
@Autowired
private HttpClientProperties properties;
// public HttpClientAutoConfiguration(HttpClientProperties properties) {
// this.properties = properties;
// }
@Bean
//在用户未定义httpClient这个bean时,才加载
@ConditionalOnMissingBean
public HttpClient httpClient() {
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(properties.getConnectTimeOut())
.setSocketTimeout(properties.getSocketTimeOut()).build();
HttpClient client= HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).setUserAgent(properties.getAgent())
.setMaxConnPerRoute(properties.getMaxConnPerRoute()).setConnectionReuseStrategy(new NoConnectionReuseStrategy()).build();
return client;
}
}
这个注解跟上面的注解很相似,前面多了个Enable。什么意思呢?如果一个类只是被@ConfigurationProperties注解,而没有使用@Component,那么该类其实是没有被spring容器管理的。上面HttpClientProperties类其实就是没有被spring管理,它只是完成了跟配置文件的映射。
@EnableConfigurationProperties的作用就是将HttpClientProperties类注入到spring容器中,这样用的时候就可以直接从spring容器中取出来。