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 ...
随机推荐
- Quill富文本编辑器的实践 - DevUI
DevUI 是一款面向企业中后台产品的开源前端解决方案,它倡导沉浸.灵活.至简的设计价值观,提倡设计者为真实的需求服务,为多数人的设计,拒绝哗众取宠.取悦眼球的设计.如果你正在开发 ToB 的工具类产 ...
- dotnet 构建还原失败 NuGet.targets 错误可能原因
我在一次断电关机之后,发现我所有的项目都构建不通过了,提示在 NuGet.targets 文件的第 130 行错误.原因就是存在有某个被项目引用的 NuGet 包被损坏,在进行 NuGet 还原时读取 ...
- 2018-8-10-win10-uwp-如何开始写-uwp-程序
title author date CreateTime categories win10 uwp 如何开始写 uwp 程序 lindexi 2018-08-10 19:16:50 +0800 201 ...
- QT 连接 MySQL 版本问题
问题现象 SSL connection error: unknown error number QMYSQL: Unable to connect 问题原因 出现这样的现象是因为我QT使用的是5.7的 ...
- vue引入一个单独的数据文件
1.新建一个address.js的文件 2.文件内const citys = { "北京市": ["东城区","西城区",& ...
- Pr 的导出视频
导出视频 https://www.bilibili.com/video/BV1Vt411n7Bb?p=7
- postgresql用sql查询表结构
查询sql如下: SELECT a.attname AS field, t.typname AS type, CASE WHEN t.typlen = -1 THEN a.atttypmod - 4 ...
- 一种利用光电容积描记(PPG)信号和深度学习模型对高血压分类的新方法
具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI 据世界心脏联合会统计,截至 2022 年,全球有 13 亿人被诊断患有高血压,每年约有 1000 万人死 ...
- java学习之旅(day.07)
面向对象编程(oop) 面向过程思想:线性思维 步骤清晰简单,每一步做什么很明确 适合处理较为简单地问题 面向对象思想:总分 抽象 属性+方法=类 分类的思维模式,思考问题首先会解决问题需要哪些分类, ...
- 关于MySQL数据库大字符串存取 类型选择
摘自:https://blog.csdn.net/weixin_40485506/article/details/83588169 关于MySQL数据库存储大字符串类型长度 根据所要存取字符长度及My ...