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 ...
随机推荐
- 涨姿势 | 一文读懂备受大厂青睐的ClickHouse高性能列存核心原理
简介: 本文尝试解读ClickHouse存储层的设计与实现,剖析它的性能奥妙 作者:和君 引言 ClickHouse是近年来备受关注的开源列式数据库,主要用于数据分析(OLAP)领域.目前国内各个大厂 ...
- Dataphin功能:集成——如何将业务系统的数据抽取汇聚到数据中台
简介: 数据集成是简单高效的数据同步平台,致力于提供具有强大的数据预处理能力.丰富的异构数据源之间数据高速稳定的同步能力,为数据中台的建设打好坚实的数据基座. 数据中台是当下大数据领域最前沿的数据建 ...
- [PHP] 业务逻辑大内存占用的优化思路, yield 和 chunk
示例: header("content-type:text/html;charset=utf-8"); function readTxt() { $handle = fopen ...
- [FAQ] swagger-php 支持 Authorization Bearer token 校验的用法
@OA\SecurityScheme 可以是 Controller 层面也可以是 Action 层面. 类型 type="apiKey". in="header" ...
- 如何参与 .NET 的开发和设计
现在 dotnet 属于 dotnet 基金会,所有开发者都可以向 dotnet 贡献代码和参与 .NET 的设计,参与路线决策.本文来告诉大家一些基本玩法,带着小伙伴们入坑 注意哦,参与 dotne ...
- vue项目中element-ui等UI组件自定义样式不生效的解决
引 在使用element-ui的时候虽然默认的样式已经能够满足很多的需求了,但是有总是有时候要加上些自定义的需求.不过,有的时候样式写上去了,按理说应该是没错的,但却是不生效呢. 其实在vue项目中使 ...
- frp内网穿透器安装与介绍
1.NAT访问 2.FRP介绍 中文官方文档:https://gofrp.org/docs/ github:https://github.com/fatedier/frp/releases frp 采 ...
- java 高并发下超购问题解决
//@desc:java 高并发下锁机制初探 //@desc:码字不宜,转载请注明出处 //@author:张慧源 <turing_zhy@163.com> //@date:2021/1 ...
- 国产ChatGPT
随着ChatGPT的威名席卷全球,大洋对岸的中国厂商也纷纷亮剑,各式本土大模型你方唱罢我登场,声势浩大的发布会排满日程表.
- 「IT运维迷宫」那些让人头疼的常见问题与破局之道
在数字化浪潮汹涌的今天,IT运维如同一座错综复杂的迷宫,稍有不慎便可能迷失方向.作为企业运营的幕后英雄,运维团队常常面临着各种突如其来的挑战.本文将带你深入探索IT运维中的那些常见"坑&qu ...