spring如何动态指定具体实现类
作者:登顶 发布时间:2022-04-13 07:52:21
标签:spring,实现类
在写接口实现时,有时会有多个实现类。这篇文章介绍在调用时通过传入字符串来指定具体的实现类。
一.接口与实现类:
// 接口
public interface ServiceInterface {
public void method();
}
// 具体两个实现类
@Service("aService")
public class AServiceImpl implements ServiceInterface {
@Override
public void method() {
System.out.println("the impl is A");
}
@Override
public String toString() {
return "A";
}
}
@Service("bService")
public class BServiceImpl implements ServiceInterface {
@Override
public void method() {
System.out.println("the impl is B");
}
@Override
public String toString() {
return "B";
}
}
在实现类中重写了toString() 方法,可以自定义字符串,当调用时传入指定的字符串就能获取到相应的bean。
二.register书写:
@Service("register")
public class Register implements InitializingBean, ApplicationContextAware {
private Map<String, ServiceInterface> serviceImplMap = new HashMap<>();
private ApplicationContext applicationContext;
// 获取spring的上下文
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
// 获取接口实现类的所有bean,并按自己定的规则放入map中
@Override
public void afterPropertiesSet() throws Exception {
Map<String, ServiceInterface> beanMap = applicationContext.getBeansOfType(ServiceInterface.class);
// 以下代码是将bean按照自己定的规则放入map中,这里我的规则是key:service.toString();value:bean
// 调用时,参数传入service.toString()的具体字符串就能获取到相应的bean
// 此处也可以不做以下的操作,直接使用beanMap,在调用时,传入bean的名称
for (ServiceInterface serviceImpl : beanMap.values()) {
serviceImplMap.put(serviceImpl.toString(), serviceImpl);
}
}
public ServiceInterface getServiceImpl(String name) {
return serviceImplMap.get(name);
}
}
三.测试类:
@Resource
Register register;
@Test
public void testService() {
ServiceInterface service = register.getServiceImpl("A");
service.method();
ServiceInterface service2 = register.getServiceImpl("B");
service2.method();
}
运行结果,如图:
备注:
在spring加载后,获取applicationContext的方法:
实现ApplicationContextAware接口的Bean,在Bean加载的过程中可以获取到Spring的ApplicationContext,这个尤其重要,ApplicationContext是Spring应用上下文,从ApplicationContext中可以获取包括任意的Bean在内的大量Spring容器内容和信息
@Component("informerRegistry")
public final class InformerRegistry implements ApplicationContextAware{
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
关于spring常用bean扩展接口可参考:http://www.cnblogs.com/xrq730/p/5721366.html
注意:
使用以下方法获取spring上下文时,会启动spring。多次写以下方法,就会启动多个spring容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:META-INF/spring/*.xml");
0
投稿
猜你喜欢
- java中初始化MediaRecorder实现代码:private boolean initializeVideo() { &
- 前言这篇文章主要是从类中static修饰的成员变量,static修饰的成员方法这两个方面来讲解static,static成员变量的初始化会在
- IDEA 2020 源生是不支持中文的,感谢捷克工程师(可能是由国人实现)对我大天朝程序员的“照顾”,且不说这个必要性到底有多大,但从侧面体
- 本文主要记录JAVA中对象的初始化过程,包括实例变量的初始化和类变量的初始化以及final关键字对初始化的影响。另外,还讨论了由于继承原因,
- 本文实例为大家分享了java实现简单的图书管理系统的具体代码,供大家参考,具体内容如下一、项目分布Book类: 定义了书的一些属性(书名,作
- import java.io.BufferedReader; import java.io.IOException;  
- Java7中文件IO发生了很大的变化,专门引入了很多新的类:import java.nio.file.DirectoryStream;imp
- Java main 方法面试题的详细整理1.不用main方法如何定义一个类?不行,没有main方法我们不能运行Java类。在java 7之前
- 我们经常需要对我们的开发的软件做各种测试, 软件对系统资源的使用情况更是不可少, 目前有多个监控工具, 相比JProfiler对系统资源尤其
- java jdbc连接和使用jdbc导入驱动//jar是已经打包好的class文件集,可以引用到其他工程中 //Build Pa
- 1、简介双重检查锁定(也叫做双重检查锁定优化)是一种软件设计模式。它的作用是减少延迟初始化在多线程环境下获取锁的次数,尤其是单例模式下比较突
- 本文为大家分享两个实例,相信大家一定会喜欢。实例1:随机生成验证码图片并将之输出为一个png文件效果图:import java.awt.Co
- 一,FileWritter写入文件FileWritter, 字符流写入字符到文件。默认情况下,它会使用新的内容取代所有现有的内容,然而,当指
- 1 简介Solace是一个强大的实时性的事件驱动消息队列。本文将介绍如何在Spring中使用,虽然代码使用的是Spring Boot,但并没
- Servlet 实现文件上传所谓文件上传就是将本地的文件发送到服务器中保存。例如我们向百度网盘中上传本地的资源或者我们将写好的博客上传到服务
- 工具方法:本文的目的是把json串转成map键值对存储,而且只存储叶节点的数据maven 引用jar包版本:<dependency&g
- 比较适合新手。逻辑上仍然有点问题。可以用于学习java文件操作下载地址:http://yun.baidu.com/share/link?sh
- /** * 三角数字: * 比达哥斯拉领导下的古希腊数学家发现了一个有趣的数字序列1, 3, 6, 10, 15, 21,... *
- 一、问题描述上周不是搭了个SpringBoot整合sharding-jdbc分库分表的架子么,组里老哥不让我把开发环境的配置文件放到reso
- 本节我们来探讨如何使用Feign构造多参数的请求。笔者以GET以及POST方法的请求为例进行讲解,其他方法(例如DELETE、PUT等)的请