- starter是SpringBoot的核心組成部分,在starter中springboot為我們提供了很多的默認(rèn)封裝乙嘀,同時(shí)提供了可擴(kuò)展性的節(jié)點(diǎn)。我們?cè)谑褂玫臅r(shí)候,可以使用默認(rèn)的封裝委造,或者在application.properties配置文件中自己定義,這樣就能實(shí)現(xiàn)靈活的運(yùn)用均驶,接下來(lái)我們就來(lái)自定義starter并且通過spring-boot-autoconfigure完成自動(dòng)化配置昏兆。
- 先熟悉springboot提供的一些列條件注解:
@ConditionalOnBean:當(dāng)SpringIoc容器內(nèi)存在指定Bean的條件
@ConditionalOnClass:當(dāng)SpringIoc容器內(nèi)存在指定Class的條件
@ConditionalOnExpression:基于SpEL表達(dá)式作為判斷條件
@ConditionalOnJava:基于JVM版本作為判斷條件
@ConditionalOnJndi:在JNDI存在時(shí)查找指定的位置
@ConditionalOnMissingBean:當(dāng)SpringIoc容器內(nèi)不存在指定Bean的條件
@ConditionalOnMissingClass:當(dāng)SpringIoc容器內(nèi)不存在指定Class的條件
@ConditionalOnNotWebApplication:當(dāng)前項(xiàng)目不是Web項(xiàng)目的條件
@ConditionalOnProperty:指定的屬性是否有指定的值
@ConditionalOnResource:類路徑是否有指定的值
@ConditionalOnSingleCandidate:當(dāng)指定Bean在SpringIoc容器內(nèi)只有一個(gè),或者雖然有多個(gè)但是指定首選的Bean
@ConditionalOnWebApplication:當(dāng)前項(xiàng)目是Web項(xiàng)目的條件
一妇穴、創(chuàng)建maven項(xiàng)目導(dǎo)入自動(dòng)配置依賴
- 這里只是添加了spring-boot-autoconfigure爬虱,可以根據(jù)自己封裝的業(yè)務(wù)內(nèi)容進(jìn)行添加
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qiu</groupId>
<artifactId>hello</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
</project>
二隶债、自定義業(yè)務(wù)所需要的默認(rèn)操作
- @ConfigurationProperties注解內(nèi)我們使用到了屬性preffix,該屬性配置了讀取參數(shù)的前綴跑筝,根據(jù)上面的實(shí)體屬性對(duì)應(yīng)配置文件內(nèi)的配置則是hello.message死讹、hello.show,當(dāng)然我們提供了默認(rèn)值曲梗,配置文件內(nèi)不進(jìn)行配置時(shí)則是使用默認(rèn)值赞警。
//配置默認(rèn)的參數(shù)實(shí)體類
@ConfigurationProperties(prefix = "hello")
public class HelloProperties {
//消息內(nèi)容
private String message = "hello world";
//是否顯示消息內(nèi)容
private boolean show = true;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public boolean isShow() {
return show;
}
public void setShow(boolean show) {
this.show = show;
}
}
三、編寫自定義的業(yè)務(wù)
//自定義的業(yè)務(wù)類
public class HelloService {
//消息內(nèi)容
private String message;
//是否顯示消息內(nèi)容
private boolean show ;
public String sayHello()
{
return show ? "Hello虏两," + message : "Hidden";
}
public void setMessage(String message) {
this.message = message;
}
public void setShow(boolean show) {
this.show = show;
}
}
四愧旦、自定義starter自動(dòng)化配置
@Configuration//開啟配置
@EnableConfigurationProperties(HelloProperties.class)//開啟使用映射實(shí)體對(duì)象
@ConditionalOnClass(HelloService.class)//存在HelloService時(shí)初始化該配置類
public class HelloAutoConfiguration {
//application.properties配置文件映射前綴實(shí)體對(duì)象
@Autowired
private HelloProperties helloProperties;
/**
* 根據(jù)條件判斷不存在HelloService時(shí)初始化新bean到SpringIoc
* @return
*/
@Bean//創(chuàng)建HelloService實(shí)體bean
@ConditionalOnMissingBean(HelloService.class)//缺失HelloService實(shí)體bean時(shí),初始化HelloService并添加到SpringIoc
public HelloService helloService()
{
System.out.println(">>>The HelloService Not Found定罢,Execute Create New Bean.");
HelloService helloService = new HelloService();
helloService.setMessage(helloProperties.getMessage());//設(shè)置消息內(nèi)容
helloService.setShow(helloProperties.isShow());//設(shè)置是否顯示
return helloService;
}
}
五忘瓦、自定義spring.factories
- 在src/main/resource目錄下創(chuàng)建META-INF目錄,并在目錄內(nèi)添加文件spring.factories
//配置自定義Starter的自動(dòng)化配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.qiu.hello.HelloAutoConfiguration
六引颈、另一個(gè)項(xiàng)目中進(jìn)行測(cè)試
- 先進(jìn)行打包:步驟:工具右側(cè) -> Maven Projects -> Lifecycle -> install耕皮,然后在另一個(gè)項(xiàng)目中引入
<!--自定義starter依賴-->
<dependency>
<groupId>com.qiu</groupId>
<artifactId>hello</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
-
開啟項(xiàng)目
- 自測(cè):
@RestController
public class HelloController
{
//注入自定義starter內(nèi)邏輯
@Autowired
HelloService helloService;
/**
* 測(cè)試訪問地址/hello
* @return 格式化字符串
*/
@RequestMapping(value = "/hello")
public String sayHello()
{
return helloService.sayHello();
}
}
返回:Hello,hello world
- 在applicationh.properties配置文件中配置后再進(jìn)行測(cè)試
參考:https://blog.csdn.net/weixin_42033269/article/details/80026078?utm_source=blogxgwz0