当前位置: 首页 > news >正文

SpringBoot工厂模式

前言

下面的示例展示了 SpringBoot 中如何使用工厂模式,该示例通过 ApplicationContext 直接获取 Spring 容器中所有 Animal 的 Bean,然后将它们存储在 animalMap 中,使用时直接从 Map 中获取实例。

另一种工厂模式可参考我另一篇文章 :SpringBoot 工厂模式自动注入到Map

一、建立父类

public abstract class Animal {public abstract void makeSound();public abstract String getType();
}

二、两个子类

@Component
public class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("Miao!");}@Overridepublic String getType() {return "cat";}
}
@Component
public class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Wang!");}@Overridepublic String getType() {return "dog";}
}

三、工厂类注入到 map 里

@Component
public class AnimalFactory implements ApplicationContextAware, InitializingBean {private final Map<String, Animal> animalMap = new ConcurrentHashMap<>();private ApplicationContext appContext;public Animal getAnimal(String animalType) {Animal animal = this.animalMap.get(animalType);if (animal == null) {throw new IllegalArgumentException("Unsupported animal type: " + animalType);}return animal;}@Overridepublic void afterPropertiesSet() throws Exception {Map<String, Animal> beansOfType = this.appContext.getBeansOfType(Animal.class);beansOfType.values().forEach(animal -> animalMap.put(animal.getType(), animal));}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.appContext = applicationContext;}
}

四、测试

@Autowiredprivate AnimalFactory animalFactory;public void printSound() throws Exception {Animal animal_1 = animalFactory.getAnimal("dog");animal_1.makeSound(); // 输出 "Wang!"Animal animal_2 = animalFactory.getAnimal("cat");animal_2.makeSound(); // 输出 "Miao!"}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【重点】人工智能大语言模型技术发展研究报告2024|附下载
  • 旅游社交小程序的设计
  • 借题《黑神话悟空》,聊聊UE5 游戏开发中基本的 C++ 概念
  • 如何在分布式环境中实现高可靠性分布式锁
  • 我在某日重新下载了idea
  • Vue中字节流格式的 Base64编码转换为 Blob 对象保存成wav的音频文件
  • Jmeter性能关注指标详解
  • Day18_Netty
  • Spark MLlib 特征工程系列—特征转换SQLTransformer
  • 数学建模学习(127):基于Python的模糊最佳-最差法(Fuzzy BWM)在多准则决策中的应用
  • 8.20-ansible剧本的使用+roles的应用
  • 书橱系统小程序的设计
  • C控制语句:分支和跳转(终章·题目)
  • redis | 认识非关系型数据库Redis的列表类型及python如何操作redis
  • 【Redis】Redis客户端——Jedis(Java)
  • 10个确保微服务与容器安全的最佳实践
  • angular组件开发
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  •  D - 粉碎叛乱F - 其他起义
  • IndexedDB
  • Java编程基础24——递归练习
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Making An Indicator With Pure CSS
  • Vue ES6 Jade Scss Webpack Gulp
  • vue2.0项目引入element-ui
  • 对象引论
  • 服务器之间,相同帐号,实现免密钥登录
  • 关于 Cirru Editor 存储格式
  • 每天一个设计模式之命令模式
  • 前端_面试
  • 前端面试总结(at, md)
  • 前端之Sass/Scss实战笔记
  • 深入浅出webpack学习(1)--核心概念
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • UI设计初学者应该如何入门?
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #1014 : Trie树
  • $$$$GB2312-80区位编码表$$$$
  • (21)起落架/可伸缩相机支架
  • (编译到47%失败)to be deleted
  • (附源码)springboot教学评价 毕业设计 641310
  • (三)模仿学习-Action数据的模仿
  • (四)Linux Shell编程——输入输出重定向
  • (算法)硬币问题
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (转)平衡树
  • .bat批处理出现中文乱码的情况
  • .Family_物联网
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET IoC 容器(三)Autofac
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)