天天看點

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);
	}

}
           

繼續閱讀