溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

spring boot下怎么滿足多生產(chǎn)環(huán)境中個性化定制功能

發(fā)布時間:2022-03-14 16:10:42 來源:億速云 閱讀:168 作者:iii 欄目:web開發(fā)

本文小編為大家詳細(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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI