spring boot下怎么满足多生产环境中个性化定制功能

发布时间:2022-03-14 16:10:42 作者:iii
来源:亿速云 阅读:168

本文小编为大家详细介绍“spring boot下怎么满足多生产环境中个性化定制功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“spring boot下怎么满足多生产环境中个性化定制功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

  资源与环境

  开发环境:java1.8 + spring-boot:2.1.3.RELEASE

  需求假设

  假设使用本项目的人员为:中国人、美国人,分别能接受的语言为中文和英文。

  项目运行后,可以根据当前的访问人员是国籍来动态显示: 你好 或 hello

  有新的需求后,比如:增加德国人并显示 Hallo 。增加功能时,不更改核心代码。

  不使用if else

  注意:如果你看完需求假设后,毫无触动,请忽略本文以下内容

  解决方案

  解决方案中,我们涉及了两种设计模块,分别为: 策略模式 及 工厂模式 。

  策略模式:一般用于将具体的 算法 进行抽象及剥离。此项目中,我们的具体算法是 说你好 。

  工厂模式:一般用于根据环境来动态的创建BEAN的情况下。引项目中,我们将根据不同国家的人,来返回不同的 说你好 这个算法。

  先给出UML图:

  SpeakService

  SpeakService 即为我们供其它模块调用的 说话服务 ,调用其中的 SayHello() 来完成 说你好功能。

  package com.mengyunzhi.demo.dynamicautowire;

  /**

  * 你好

  */

  public interface SpeakService {

  void sayHello();

  }

  在其实现类中,我们注入 SayHelloFactory ,让其来返回正确的 SayHelloService ,最终调用 sayHello() 来完成目标。

  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 表示当前访问者的国家。其实在获取访问者国家时,我们也可以调用其它Bean的其它来实现。

  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时发生异常。

  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获取到的所以实现了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 对应的SayHelloService BEAN

  */

  @Override

  public SayHelloService getSayHelloService() {

  return this.servicesByCode.get(this.countryCode.getCode());

  }

  }

  增加 Map<Byte, SayHelloService> servicesByCode 来存储对应国家的 SayHelloService BEAN。增加 getSayHelloService() 来根据当前国家代码来返回相应的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() {

  // 默认说你好

  speakService.sayHello();

  // 将国家设置为美国,再说你好

  sayHelloFactory.setCountryCode(CountryCode.USA);

  speakService.sayHello();

  // 将国家设置为中国,再说你好

  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() {

  // 默认说你好

  speakService.sayHello();

  // 将国家设置为美国,再说你好

  sayHelloFactory.setCountryCode(CountryCode.USA);

  speakService.sayHello();

  // 将国家设置为德国,再说你好

  sayHelloFactory.setCountryCode(CountryCode.GERMANY);

  speakService.sayHello();

  // 将国家设置为中国,再说你好

  sayHelloFactory.setCountryCode(CountryCode.CHINA);

  speakService.sayHello();

  }

读到这里,这篇“spring boot下怎么满足多生产环境中个性化定制功能”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. Spring 核心技术与产品理念剖析【下】
  2. 7月精选的10道Spring Boot面试题(含答案解析)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring boot

上一篇:spring boot怎么整合quartz实现通过页面操作管理定时任务

下一篇:Spring接口支持返回多种格式的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》