天天看点

SpringBoot--自定义Starter的几种方式

1、方式一--main方法可以扫描到的包下

main在com.mooc.house下

自定义starter在com.mooc.house.autoconfig下

添加依赖

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

HttpClientAutoConfiguration.java

package com.mooc.house.autoconfig;

import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.NoConnectionReuseStrategy;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnClass({HttpClient.class})
@EnableConfigurationProperties(HttpClientProperties.class)
public class HttpClientAutoConfiguration {
	
	private final HttpClientProperties properties;
	
	public HttpClientAutoConfiguration(HttpClientProperties  properties){
		this.properties = properties;
	}
	
	/**
	 * HttpClient bean 的定义
	 * @return
	 */
	@Bean
	@ConditionalOnMissingBean(HttpClient.class)
	public HttpClient httpClient(){
		RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(properties.getConnectTimeOut())
				.setSocketTimeout(properties.getSocketTimtOut()).build(); // 构建requestConfig
		HttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig)
				.setUserAgent(properties.getAgent()).setMaxConnPerRoute(properties.getMaxConnPerRoute())
				.setMaxConnTotal(properties.getMaxConnTotal())
				.setConnectionReuseStrategy(new NoConnectionReuseStrategy()).build();
		
		return client;
	}
	
}
           

HttpClientProperties.java

package com.mooc1.house.autoconfig;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix="spring.httpclient")
public class HttpClientProperties {

	private String agent = "agent";
	
	private Integer maxConnPerRoute = 10;
	
	private Integer maxConnTotal = 50;
	
	private Integer connectTimeOut = 1000;
	
	private Integer socketTimtOut = 1000;

	public String getAgent() {
		return agent;
	}

	public void setAgent(String agent) {
		this.agent = agent;
	}

	public Integer getMaxConnPerRoute() {
		return maxConnPerRoute;
	}

	public void setMaxConnPerRoute(Integer maxConnPerRoute) {
		this.maxConnPerRoute = maxConnPerRoute;
	}

	public Integer getMaxConnTotal() {
		return maxConnTotal;
	}

	public void setMaxConnTotal(Integer maxConnTotal) {
		this.maxConnTotal = maxConnTotal;
	}

	public Integer getConnectTimeOut() {
		return connectTimeOut;
	}

	public void setConnectTimeOut(Integer connectTimeOut) {
		this.connectTimeOut = connectTimeOut;
	}

	public Integer getSocketTimtOut() {
		return socketTimtOut;
	}

	public void setSocketTimtOut(Integer socketTimtOut) {
		this.socketTimtOut = socketTimtOut;
	}
	
}
           

2、方式二--main扫描不到的情况,配置到spring.factories中,然main方法扫描读取

在src/main/resources/META-INF下创建spring.factories文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.mooc1.house.autoconfig.HttpClientAutoConfiguration
           

3、方式三--main扫描不到的情况,自定义EnableHttpClient注解

package com.mooc1.house.autoconfig;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.context.annotation.Import;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(HttpClientAutoConfiguration.class)
public @interface EnableHttpClient {
	
}
           

main方法类中使用注解

package com.mooc.house;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.mooc1.house.autoconfig.EnableHttpClient;

@SpringBootApplication
@EnableHttpClient
public class HouseApplication {

	public static void main(String[] args) {
		SpringApplication.run(HouseApplication.class, args);
	}

}
           

4、方式四--main扫描不到的情况,不需要自定义EnableHttpClient注解,直接使用@Import在main类中

package com.mooc.house;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;

import com.mooc1.house.autoconfig.HttpClientAutoConfiguration;

@SpringBootApplication
//@EnableHttpClient
@Import(HttpClientAutoConfiguration.class)
public class HouseApplication {

	public static void main(String[] args) {
		SpringApplication.run(HouseApplication.class, args);
	}

}
           

继续阅读