Java动态获取实现类 Class.forName(clazz).newInstance()和applicationContext.getBean, bean Map寻找方式,Java Map定义和初始化方法
Java动态获取实现类 Class.forName(clazz).newInstance()和applicationContext.getBean, bean Map寻找方式,Java Map定义和初始化方法
1.定义枚举类MyServiceTypeEnum.java
package com.example.core.mydemo.bean; public enum MyServiceTypeEnum {
SUBMIT_ORDER_SUCCESS("submitOrder", "com.example.core.mydemo.bean.MySubmitOrderImplOneService"),//下单
CANCEL_ORDER_SUCCESS("cancelOrder", "com.example.core.mydemo.bean.MyCancelOrderImplOneService"),//取消 //java.lang.ClassNotFoundException: MySubmitOrderImplOneService 类的路径需要完整的路径。
// SUBMIT_ORDER_SUCCESS("submitOrder", "MySubmitOrderImplOneService"),//下单
// CANCEL_ORDER_SUCCESS("cancelOrder", "MyCancelOrderImplOneService"),//取消
;
private String name;
private String value; MyServiceTypeEnum(String name, String value) {
this.value = value;
this.name = name;
} public String getValue() {
return value;
} public String getName() {
return name;
} /**
* 获取服务模版
* @param name
* @return
*/
public static String getServiceTemplate(String name) {
for (MyServiceTypeEnum messageServiceTypeEnum : values()) {
if (messageServiceTypeEnum.getName().equals(name)) {
return messageServiceTypeEnum.getValue();
}
}
return null;
} }
2.定义接口类 MyOrderImplOneService.java
package com.example.core.mydemo.bean; public interface MyOrderImplOneService {
/**
* 获取类名称
* @return
*/
public String getClassName();
}
3.定义提交订单实现类 MySubmitOrderImplOneService.java
package com.example.core.mydemo.bean; public class MySubmitOrderImplOneService implements MyOrderImplOneService{
@Override
public String getClassName() {
return "hello " + MySubmitOrderImplOneService.class.getName();
}
}
4.定义取消订单实现类 MyCancelOrderImplOneService.java
package com.example.core.mydemo.bean; public class MyCancelOrderImplOneService implements MyOrderImplOneService{ @Override
public String getClassName() {
return "hello " + MyCancelOrderImplOneService.class.getName();
}
}
5.测试类
package com.example.core.mydemo.bean; import org.apache.commons.lang3.StringUtils;
import org.springframework.cglib.beans.ImmutableBean;
import org.springframework.context.ApplicationContext; import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map; /**
* output:
* myOrderImplOneService class name=hello com.example.core.mydemo.bean.MySubmitOrderImplOneService
* myOrderImplOneService class name=hello com.example.core.mydemo.bean.MyCancelOrderImplOneService
* myOrderImplOneService5 class name=hello com.example.core.mydemo.bean.MySubmitOrderImplOneService
* myOrderImplOneService6 class name=hello com.example.core.mydemo.bean.MyCancelOrderImplOneService
*
*/
public class MyServiceTest { @Resource
private ApplicationContext applicationContext; //模拟 java8新特性-双括号初始化
/* public Map<String,Class> beanMap = new HashMap<String,Class>(){{
put("submitOrder",MySubmitOrderImplOneService.class);
put("cancelOrder",MyCancelOrderImplOneService.class);
}};*/ //java9新特性
// public Map<String,Class> beanMap = Map.of("","","",""); //Guava
// public Map<String,Class> beanMap = ImmutableMap.of("","","",""); //静态块的方式初始化
public static final Map<String,Class> beanMap = new HashMap<String,Class>();
static {
beanMap.put("submitOrder",MySubmitOrderImplOneService.class);
beanMap.put("cancelOrder",MyCancelOrderImplOneService.class);
} /**
* bean寻找方法
* @param name
* @return
* @throws IllegalAccessException
* @throws InstantiationException
*/
private MyOrderImplOneService beanRouting(String name) throws IllegalAccessException, InstantiationException {
return (MyOrderImplOneService) beanMap.get(name).newInstance(); // if (name.equals(MyServiceTypeEnum.SUBMIT_ORDER_SUCCESS.getName())) {
// return (MyOrderImplOneService) beanMap.get(name).newInstance();
// }else if(name.equals(MyServiceTypeEnum.CANCEL_ORDER_SUCCESS.getName())){
// return (MyOrderImplOneService) beanMap.get(name).newInstance();
// }
// return null; //默认
} /**
* Class.forName(clazz).newInstance()
* @param name
* @return
*/
public static MyOrderImplOneService getInstance(String name) {
MyOrderImplOneService inter = null;
String clazz = MyServiceTypeEnum.getServiceTemplate(name);
if (name != null && StringUtils.isNotEmpty(clazz)) {
try {
inter = (MyOrderImplOneService) Class.forName(clazz).newInstance();//调用无参构造器创建实例
} catch (Exception e) {
e.printStackTrace();
}
}
return inter;
} /**
* applicationContext.getBean方式
* @param name
* @return
*/
private MyOrderImplOneService routing(String name) {
if (name.equals(MyServiceTypeEnum.SUBMIT_ORDER_SUCCESS.getName())) {
return applicationContext.getBean(MySubmitOrderImplOneService.class);
}else if(name.equals(MyServiceTypeEnum.CANCEL_ORDER_SUCCESS.getName())){
return applicationContext.getBean(MyCancelOrderImplOneService.class);
}
return null; //默认
} public static void main(String[] args) {
/**
* Class.forName(clazz).newInstance()
*/
//java.lang.ClassNotFoundException: MySubmitOrderImplOneService
MyOrderImplOneService myOrderImplOneService = MyServiceTest.getInstance("submitOrder");
System.out.println("myOrderImplOneService class name=" + myOrderImplOneService.getClassName()); MyOrderImplOneService myOrderImplOneService2 = MyServiceTest.getInstance("cancelOrder");
System.out.println("myOrderImplOneService class name=" + myOrderImplOneService2.getClassName()); /**
* applicationContext.getBean方式
* applicationContext加载方式,需要在容器中。
*/
// MyOrderImplOneService myOrderImplOneService3 = new MyServiceTest().routing("submitOrder");
// System.out.println("myOrderImplOneService3 class name=" + myOrderImplOneService3.getClassName());
//
// MyOrderImplOneService myOrderImplOneService4 = new MyServiceTest().routing("cancelOrder");
// System.out.println("myOrderImplOneService4 class name=" + myOrderImplOneService4.getClassName()); /**
* bean寻找方法
*/
try {
MyOrderImplOneService myOrderImplOneService5 = new MyServiceTest().beanRouting("submitOrder");
System.out.println("myOrderImplOneService5 class name=" + myOrderImplOneService5.getClassName()); MyOrderImplOneService myOrderImplOneService6 = new MyServiceTest().beanRouting("cancelOrder");
System.out.println("myOrderImplOneService6 class name=" + myOrderImplOneService6.getClassName());
}catch (Exception e) {
e.printStackTrace();
}
}
}
Java动态获取实现类 Class.forName(clazz).newInstance()和applicationContext.getBean, bean Map寻找方式,Java Map定义和初始化方法的更多相关文章
- java动态获取WebService的两种方式(复杂参数类型)
java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_Fligh ...
- java反射动态加载类Class.forName();
1,所有的new出来的对象都是静态加载的,在程序编译的时候就会进行加载.而使用反射机制Class.forName是动态加载的,在运行时刻进行加载. 例子:直接上两个例子 public class Ca ...
- Java动态加载类
详见:https://blog.csdn.net/zai_xia/article/details/80026325 扩展:java反射机制与动态加载类 https://www.cnblogs.com/ ...
- java动态加载类和静态加载类笔记
JAVA中的静态加载类是编译时刻加载类 动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子 现在我创建了一个类 实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...
- Java动态加载类在功能模块开发中的作用
Java中我们一般会使用new关键字实例化对象然后调用该对象所属类提供的方法来实现相应的功能,比如我们现在有个主类叫Web类这个类中能实现各种方法,比如用户注册.发送邮件等功能,代码如下: /* * ...
- java动态更新枚举类
工作中遇到需要对枚举类的值进行动态更新 手动改不现实也不方便 现记录下来方便以后学习使用 1.在工程utils包中添加动态更新枚举类得工具类(根据自己得项目,放到指定位置调用就可以) 2.一开始陷入了 ...
- java利用反射动态获取实体类的属性值
直接贴代码吧,有需要的话,可以根据自己的需要修改部分代码: public BigDecimal getByAttributeName(ThmdGwqriR thmdGwqriR, String att ...
- Java 动态编译组件 & 类动态加载
1.JDK6 动态编译组件 Java SE 6 之后自身集成了运行时编译的组件:javax.tools,存放在 tools.jar 包里,可以实现 Java 源代码编译,帮助扩展静态应用程序.该包中提 ...
- kafka java动态获取topic并动态创建消费者
1.获取所有topic package com.example.demo; import java.io.IOException; import java.util.List; import org. ...
- Java如何获取当前类路径
1.如何获得当前文件路径 常用: (1).Test.class.getResource("") 得到的是当前类FileTest.class文件的URI目录.不包括自己! (2).T ...
随机推荐
- 最佳实践丨构建云上私有池(虚拟IDC)的5种方案详解
简介:云上私有池系列终篇终于来了,本文将重点介绍构建云上的私有池(虚拟IDC)的多种方案和各自的优缺点,并给出相关的性价比优化建议. 本文作者:阿里云技术专家李雨前 摘要 围绕私有池(虚拟IDC)的 ...
- IDC报告:阿里云领跑中国数据库市场年度份额首超传统厂商
简介: IDC报告显示,2020年中国关系型数据库软件市场规模达到121.8亿元,同比增长36.5%.其中,以公有云模式部署的关系型数据库市场占比达到51.5%,首次超过传统线下部署模式市场规模, ...
- [FAQ] 适用于 macOS / Arm64 (M1/M2) 的 VisualBox
使用与 Windows.Linux.macOS 的x86架构的一般在下面地址中下载: Download VisualBox:https://www.virtualbox.org/wiki/Down ...
- [Gin] gin-jwt 业务逻辑中使用实例化的 middleware 的方式
依然需要按文档所示实例化一个 authMiddleware. 在路由组中使用的方式是 authMiddleware.MiddlewareFunc(). 通过追踪 MiddlewareFunc 可以知道 ...
- dotnet 部署 github 的 Action 进行持续集成
被微软收购的 GitHub 现在十分土豪,提供了免费的服务器给咱构建.刚好微软对 dotnet 的支持是特别好的,毕竟还算半个自家的东西,大概只需要 3 分钟就可以在 github 上通过 Actio ...
- python01-03作业
# 小球落地,一共运动了多少米 hight = 100 # 原始高度 distance = 0 # 和 for i in range(10): # 将 下落 高度加入到 和 中 distance += ...
- vue使用echart(地图,弹窗展示多条数据,option定义)
第二次用echart,第一次做地图, <template> <div class="echarts" style="background:#3bafde ...
- vue的pc端项目+element实现分页效果
效果图: 直接使用element操作很简单,记录一下要点: 根据ele提供的api修改data v-for="(i,s) in dataView.slice((currentPage-1)* ...
- docker、docker-compose 常用命令
1.docker 常用命令 创建容器:docker create 启动容器:docker start [id] 停止容器:docker stop [id] 停止全部运行的容器:docker stop ...
- Unraid 使用 Docker Compose 安装 Immich 套件无法启用人脸识别的原因及修复方法
原因 问题原因是官方教程中的 docker-compose.yml 指明的机器学习组件 immich-machine-learning 中的 container_name 与 也就是 docker-c ...