@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容器中取出來。