spring boot自动配置
如spring-boot-starter中有spring-boot-autoconfigure包含大量自动配置
自定义自动配置如HttpClient
引入HttpClient依赖
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency>
定义配置类HttpClientAutoConfiguration.class
1 package com.xiaoping.house.autoconfig; 2 3 import org.apache.http.client.HttpClient; 4 import org.apache.http.client.config.RequestConfig; 5 import org.apache.http.impl.NoConnectionReuseStrategy; 6 import org.apache.http.impl.client.CloseableHttpClient; 7 import org.apache.http.impl.client.HttpClientBuilder; 8 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 9 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 10 import org.springframework.boot.context.properties.EnableConfigurationProperties; 11 import org.springframework.context.annotation.Bean; 12 import org.springframework.context.annotation.Configuration; 13 14 15 @Configuration 16 @ConditionalOnClass({HttpClient.class}) 17 @EnableConfigurationProperties(HttpClientProperties.class) 18 public class HttpClientAutoConfiguration { 19 private final HttpClientProperties properties; 20 21 public HttpClientAutoConfiguration(HttpClientProperties properties) { 22 this.properties = properties; 23 } 24 @Bean 25 @ConditionalOnMissingBean(HttpClient.class) 26 public HttpClient httpClient(){ 27 RequestConfig build = RequestConfig.custom().setConnectTimeout(properties.getConnectTimeOut()).setSocketTimeout(properties.getSocketTimeOut()).build(); 28 CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(build).setUserAgent(properties.getAgent()).setMaxConnPerRoute(properties.getMaxConnPerRoute()).setMaxConnTotal(properties.getMaxConnTototal()).setConnectionReuseStrategy(new NoConnectionReuseStrategy()).build(); 29 return httpClient; 30 } 31 }
其中HttpClientProperties类:可以在application.properties配置spring.httpclient.connect_time_out值
1 package com.xiaoping.house.autoconfig; 2 3 import lombok.Data; 4 import org.springframework.boot.context.properties.ConfigurationProperties; 5 @Data 6 @ConfigurationProperties(prefix = "spring.httpclient") 7 public class HttpClientProperties { 8 private Integer connectTimeOut=1000; 9 private Integer socketTimeOut=10000; 10 11 private String agent="agent"; 12 private Integer maxConnPerRoute=10; 13 private Integer maxConnTototal=50; 14 15 }
测试使用
1 package com.xiaoping.house; 2 3 import org.apache.http.client.HttpClient; 4 import org.apache.http.client.methods.HttpGet; 5 import org.apache.http.util.EntityUtils; 6 import org.junit.Test; 7 import org.junit.runner.RunWith; 8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.boot.test.context.SpringBootTest; 10 import org.springframework.test.context.junit4.SpringRunner; 11 12 import java.io.IOException; 13 14 @RunWith(SpringRunner.class) 15 @SpringBootTest 16 public class HouseApplicationTests { 17 @Autowired 18 private HttpClient httpClient; 19 @Test 20 public void testHttpClient() throws IOException { 21 System.out.println(EntityUtils.toString(httpClient.execute(new HttpGet("http://www.baidu.com")).getEntity())); 22 } 23 24 }
自动配置的原理是:
启动类中@SpringBootApplication会自动加载该类下和所有子类带有@Configuration的类
如果HttpClientAutoConfiguration.class不在子类下,在其他包下,如何让spring boot自动加载?
第一种方法:resources/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
xcom.HttpClientAutoConfiguration
xcom.HttpClientAutoConfiguration是要加载的类
第二种方法@EnableXxx注解使用,如@EnableAysn
定义注解EnableHttpClient
package xcom; import org.springframework.context.annotation.Import; import java.lang.annotation.*; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Import({HttpClientAutoConfiguration.class}) public @interface EnableHttpClient { }
在启动类中添加注解
@SpringBootApplication
@EnableHttpClient