您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“spring boot下怎么滿足多生產(chǎn)環(huán)境中個性化定制功能”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“spring boot下怎么滿足多生產(chǎn)環(huán)境中個性化定制功能”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
資源與環(huán)境
開發(fā)環(huán)境:java1.8 + spring-boot:2.1.3.RELEASE
需求假設(shè)
假設(shè)使用本項目的人員為:中國人、美國人,分別能接受的語言為中文和英文。
項目運行后,可以根據(jù)當(dāng)前的訪問人員是國籍來動態(tài)顯示: 你好 或 hello
有新的需求后,比如:增加德國人并顯示 Hallo 。增加功能時,不更改核心代碼。
不使用if else
注意:如果你看完需求假設(shè)后,毫無觸動,請忽略本文以下內(nèi)容
解決方案
解決方案中,我們涉及了兩種設(shè)計模塊,分別為: 策略模式 及 工廠模式 。
策略模式:一般用于將具體的 算法 進(jìn)行抽象及剝離。此項目中,我們的具體算法是 說你好 。
工廠模式:一般用于根據(jù)環(huán)境來動態(tài)的創(chuàng)建BEAN的情況下。引項目中,我們將根據(jù)不同國家的人,來返回不同的 說你好 這個算法。
先給出UML圖:
SpeakService
SpeakService 即為我們供其它模塊調(diào)用的 說話服務(wù) ,調(diào)用其中的 SayHello() 來完成 說你好功能。
package com.mengyunzhi.demo.dynamicautowire;
/**
* 你好
*/
public interface SpeakService {
void sayHello();
}
在其實現(xiàn)類中,我們注入 SayHelloFactory ,讓其來返回正確的 SayHelloService ,最終調(diào)用 sayHello() 來完成目標(biāo)。
package com.mengyunzhi.demo.dynamicautowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 你好
*/
@Service
public class SpeakServiceImpl implements SpeakService {
private final
SayHelloFactory sayHelloFactory; // 說話工廠
@Autowired
public SpeakServiceImpl(SayHelloFactory sayHelloFactory) {
this.sayHelloFactory = sayHelloFactory;
}
@Override
public void sayHello() {
this.sayHelloFactory.getSayHelloService()。sayHello();
}
}
SayHelloFactory
package com.mengyunzhi.demo.dynamicautowire;
/**
* 說話工廠
*/
public interface SayHelloFactory {
void setCountryCode(CountryCode countryCode);
SayHelloService getSayHelloService();
}
在此,我們增加一個 CountryCode 表示當(dāng)前訪問者的國家。其實在獲取訪問者國家時,我們也可以調(diào)用其它Bean的其它來實現(xiàn)。
package com.mengyunzhi.demo.dynamicautowire;
/**
* 國家代碼
*/
public enum CountryCode {
CHINA((byte) 0, "中國"),
USA((byte) 1, "美國");
private Byte code;
private String name;
CountryCode(Byte code, String name) {
this.code = code;
this.name = name;
}
public Byte getCode() {
return code;
}
public String getName() {
return name;
}
}
使用 enum 來控制范圍,避免 Factory 在獲取Bean時發(fā)生異常。
package com.mengyunzhi.demo.dynamicautowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 說話工廠
*/
@Service
public class SayHelloFactoryImpl implements SayHelloFactory {
/**
* BEAN列表
*/
private final Map<Byte, SayHelloService> servicesByCode = new HashMap<>();
/**
* 國家代碼
*/
private CountryCode countryCode = CountryCode.CHINA;
@Override
public void setCountryCode(CountryCode countryCode) {
this.countryCode = countryCode;
}
/**
* 初始化
*
* @param sayHelloServices spring獲取到的所以實現(xiàn)了SpeakService的BEAN
*/
@Autowired
public void init(List<SayHelloService> sayHelloServices) {
for (SayHelloService sayHelloService : sayHelloServices) {
this.register(sayHelloService.getCode(), sayHelloService);
}
}
/**
* 注冊Bean
*
* @param code 代碼
* @param sayHelloService BEAN
*/
private void register(Byte code, SayHelloService sayHelloService) {
this.servicesByCode.put(code, sayHelloService);
}
/**
* 獲取BEAN
*
* @return 對應(yīng)的SayHelloService BEAN
*/
@Override
public SayHelloService getSayHelloService() {
return this.servicesByCode.get(this.countryCode.getCode());
}
}
增加 Map<Byte, SayHelloService> servicesByCode 來存儲對應(yīng)國家的 SayHelloService BEAN。增加 getSayHelloService() 來根據(jù)當(dāng)前國家代碼來返回相應(yīng)的Bean。
SayHelloService
package com.mengyunzhi.demo.dynamicautowire;
/**
* 說話
*/
public interface SayHelloService {
void sayHello();
Byte getCode();
}
將 sayHello() 方法抽離, getCode() 以獲取國家代碼。
中國人你好
package com.mengyunzhi.demo.dynamicautowire;
import org.springframework.stereotype.Component;
/**
* 中國話
*/
@Component
public class SayHelloServiceChineseImpl implements SayHelloService {
@Override
public void sayHello() {
System.out.println("您好");
}
@Override
public Byte getCode() {
return CountryCode.CHINA.getCode();
}
}
美國人Hello
package com.mengyunzhi.demo.dynamicautowire;
import org.springframework.stereotype.Component;
/**
* 美國話
*/
@Component
public class SayHelloServiceEnglishImpl implements SayHelloService {
@Override
public void sayHello() {
System.out.println("hello");
}
@Override
public Byte getCode() {
return CountryCode.USA.getCode();
}
}
測試
package com.mengyunzhi.demo.dynamicautowire;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpeakServiceImplTest {
@Autowired
SpeakService speakService;
@Autowired
SayHelloFactory sayHelloFactory;
@Test
public void sayHello() {
// 默認(rèn)說你好
speakService.sayHello();
// 將國家設(shè)置為美國,再說你好
sayHelloFactory.setCountryCode(CountryCode.USA);
speakService.sayHello();
// 將國家設(shè)置為中國,再說你好
sayHelloFactory.setCountryCode(CountryCode.CHINA);
speakService.sayHello();
}
}
您好
hello
您好
時序圖
增加德國人
SayHelloServiceGermanyImpl
CountryCode
package com.mengyunzhi.demo.dynamicautowire;
import org.springframework.stereotype.Component;
@Component
public class SayHelloServiceGermanyImpl implements SayHelloService {
@Override
public void sayHello() {
System.out.println("Hallo");
}
@Override
public Byte getCode() {
return CountryCode.GERMANY.getCode();
}
}
package com.mengyunzhi.demo.dynamicautowire;
/**
* 國家代碼
*/
public enum CountryCode {
CHINA((byte) 0, "中國"),
USA((byte) 1, "美國"),
GERMANY((byte) 2, "德國");
private Byte code;
private String name;
CountryCode(Byte code, String name) {
this.code = code;
this.name = name;
}
public Byte getCode() {
return code;
}
public String getName() {
return name;
}
}
單元測試
@Test
public void sayHello1() {
// 默認(rèn)說你好
speakService.sayHello();
// 將國家設(shè)置為美國,再說你好
sayHelloFactory.setCountryCode(CountryCode.USA);
speakService.sayHello();
// 將國家設(shè)置為德國,再說你好
sayHelloFactory.setCountryCode(CountryCode.GERMANY);
speakService.sayHello();
// 將國家設(shè)置為中國,再說你好
sayHelloFactory.setCountryCode(CountryCode.CHINA);
speakService.sayHello();
}
讀到這里,這篇“spring boot下怎么滿足多生產(chǎn)環(huán)境中個性化定制功能”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。