文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

本文小编为大家详细介绍“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 {

  

  private final Map<Byte, SayHelloService> servicesByCode = new HashMap<>();

  

  private CountryCode countryCode = CountryCode.CHINA;

  @Override

  public void setCountryCode(CountryCode countryCode) {

  this.countryCode = countryCode;

  }

  

  @Autowired

  public void init(List<SayHelloService> sayHelloServices) {

  for (SayHelloService sayHelloService : sayHelloServices) {

  this.register(sayHelloService.getCode(), sayHelloService);

  }

  }

  

  private void register(Byte code, SayHelloService sayHelloService) {

  this.servicesByCode.put(code, sayHelloService);

  }

  

  @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下怎么满足多生产环境中个性化定制功能”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯