前面給大家介紹了 SpringBoot
的自動(dòng)裝配功能,相信大家對(duì)自動(dòng)裝配都有了很好的理解,那么今天阿粉通過(guò)一個(gè)示例來(lái)給大家演示一下如何編寫(xiě)一個(gè)自己的 starter
。
再編寫(xiě) starter
之前我們先了解一下什么是 starter
,一個(gè) starter
其實(shí)就是對(duì)一個(gè)功能的集成封裝,然后對(duì)外提供一個(gè)依賴(lài),讓業(yè)務(wù)去使用,像我們熟悉的 Redis
,mongo
,mybatis
等。另外由于任何人都可以編寫(xiě)自己的 starter
,那么為了區(qū)分官方的 starter
和個(gè)人的 starter
,通常在命名上面會(huì)有一個(gè)規(guī)范。所以 SpringBoot
官方提出,第三方在建立自己的 Starter
的時(shí)候命名規(guī)則統(tǒng)一用xxx-spring-boot-starter
,而官方提供的 Starter
統(tǒng)一命名方式為spring-boot-starter-xxx
。
通過(guò)我們前面的文章,我們知道自動(dòng)裝配首先要有一個(gè)配置類(lèi),其次還要有 spring.factories
文件,所以這兩步是必不可少的。接下來(lái)我們就實(shí)操一下。
編寫(xiě)配置類(lèi)
編寫(xiě)配置類(lèi)首先要添加一個(gè)自動(dòng)裝配的依賴(lài),然后再編寫(xiě)對(duì)應(yīng)的配置類(lèi)和業(yè)務(wù)實(shí)現(xiàn)類(lèi),在 pom
中添加如下依賴(lài)
< dependency >
< groupId >org.springframework.boot< /groupId >
< artifactId >spring-boot-autoconfigure< /artifactId >
< version >2.7.1< /version >
< /dependency >
裝配類(lèi)
package com.example.hash.starter.config;
import com.example.hash.starter.service.MyHashTemplate;
import org.springframework.beans.factory.annotation.Autowired;
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({MyHashTemplate.class})
@EnableConfigurationProperties(MyHashProperties.class)
public class MyHashAutoConfiguration {
@Autowired
MyHashProperties myHashProperties;
@Bean
@ConditionalOnMissingBean(MyHashTemplate.class)
public MyHashTemplate myJsonService() {
MyHashTemplate myHashTemplate = new MyHashTemplate();
myHashTemplate.setPrefix(myHashProperties.getHashPre());
return myHashTemplate;
}
}
屬性類(lèi)
package com.example.hash.starter.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "ziyou.hash")
public class MyHashProperties {
private String hashPre;
public String getHashPre() {
return hashPre;
}
public void setHashPre(String hashPre) {
this.hashPre = hashPre;
}
}
業(yè)務(wù)實(shí)現(xiàn)類(lèi)
package com.example.hash.starter.service;
import javax.xml.bind.DatatypeConverter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MyHashTemplate {
private String prefix;
public String myHash(String origin) {
if (null == origin || origin.length() == 0) {
return null;
}
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(origin.getBytes());
byte[] digest = md.digest();
return this.prefix + ":" + DatatypeConverter.printHexBinary(digest).toUpperCase();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
}
簡(jiǎn)單說(shuō)明一下上面三個(gè)類(lèi)都是干什么的,MyHashTemplate
該類(lèi)是實(shí)際業(yè)務(wù)需要注入的類(lèi),用來(lái)對(duì)入?yún)⑦M(jìn)行 MD5
摘要,然后返回一個(gè)拼接了前綴的字符串給業(yè)務(wù)。這個(gè)前綴是通過(guò) application.properties
中配置 ziyou.hash.hashPre=JavaGeekTech666
配置后傳遞過(guò)來(lái)的。MyHashProperties
是接受屬性值的類(lèi),MyHashAutoConfiguration
則是自動(dòng)裝配類(lèi),這個(gè)類(lèi)會(huì)根據(jù)條件進(jìn)行 MyHashTemplate``Bean
的初始化,并將前綴進(jìn)行賦值。
增加配置文件
最后還需要在 resource
文件中編寫(xiě)一個(gè) META-INF/spring.factories
文件,內(nèi)容如下
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.hash.starter.config.MyHashAutoConfiguration
前面的 Key
是固定寫(xiě)法,后面的 value
就是配置類(lèi)的全路徑引用地址。
在項(xiàng)目中使用
編寫(xiě)完了 starter
過(guò)后,我們?cè)賱?chuàng)建一個(gè)新的 web
應(yīng)用,在其中增加我們編寫(xiě)的 starter
來(lái)驗(yàn)證是否成功。第一步在 pom
文件中增加依賴(lài)
< dependency >
< groupId >com.starter.example< /groupId >
< artifactId >myhash-spring-boot-starter< /artifactId >
< version >0.0.1-SNAPSHOT< /version >
< /dependency >
package com.example.demo.controller;
import com.example.demo.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private HelloService helloService;
@GetMapping(value = "/hello")
public String hello(@RequestParam("name") String name) {
return helloService.sayHello(name);
}
}
package com.example.demo.service;
import com.example.hash.starter.service.MyHashTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class HelloService {
@Autowired
private MyHashTemplate myHashTemplate;
public String sayHello(String name) {
return myHashTemplate.myHash(name);
}
}
在 application.properties
文件中增加如下配置
ziyou.hash.hashPre=JavaGeekTech
啟動(dòng)項(xiàng)目,我們?cè)L問(wèn)地址 http://127.0.0.1:8080/hello?name=ziyou 可以看到效果如下。
至此可以看到,我們自己編寫(xiě)的 starter
已經(jīng)成功生效了,只不過(guò)功能很簡(jiǎn)單而已,我們完全可以根據(jù)自己需要的實(shí)際功能來(lái)實(shí)現(xiàn)一個(gè)復(fù)雜一點(diǎn)的 starter
來(lái)提供開(kāi)箱即用的效果。
-
封裝
+關(guān)注
關(guān)注
126文章
7873瀏覽量
142893 -
文件
+關(guān)注
關(guān)注
1文章
565瀏覽量
24727 -
配置
+關(guān)注
關(guān)注
1文章
188瀏覽量
18375 -
Starter
+關(guān)注
關(guān)注
0文章
8瀏覽量
7542
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論