spring boot自动配置

如spring-boot-starter中有spring-boot-autoconfigure包含大量自动配置

自定义自动配置如HttpClient

引入HttpClient依赖

    <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
View Code

定义配置类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 }
View Code

  其中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 }
View Code

测试使用

 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 }
View Code

自动配置的原理是:

启动类中@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 {
}
View Code

  在启动类中添加注解

@SpringBootApplication
@EnableHttpClient

 

posted @ 2018-03-01 10:28  88aa123  阅读(331)  评论(0编辑  收藏  举报