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定义和初始化方法的更多相关文章

  1. java动态获取WebService的两种方式(复杂参数类型)

    java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_Fligh ...

  2. java反射动态加载类Class.forName();

    1,所有的new出来的对象都是静态加载的,在程序编译的时候就会进行加载.而使用反射机制Class.forName是动态加载的,在运行时刻进行加载. 例子:直接上两个例子 public class Ca ...

  3. Java动态加载类

    详见:https://blog.csdn.net/zai_xia/article/details/80026325 扩展:java反射机制与动态加载类 https://www.cnblogs.com/ ...

  4. java动态加载类和静态加载类笔记

    JAVA中的静态加载类是编译时刻加载类  动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子  现在我创建了一个类  实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...

  5. Java动态加载类在功能模块开发中的作用

    Java中我们一般会使用new关键字实例化对象然后调用该对象所属类提供的方法来实现相应的功能,比如我们现在有个主类叫Web类这个类中能实现各种方法,比如用户注册.发送邮件等功能,代码如下: /* * ...

  6. java动态更新枚举类

    工作中遇到需要对枚举类的值进行动态更新 手动改不现实也不方便 现记录下来方便以后学习使用 1.在工程utils包中添加动态更新枚举类得工具类(根据自己得项目,放到指定位置调用就可以) 2.一开始陷入了 ...

  7. java利用反射动态获取实体类的属性值

    直接贴代码吧,有需要的话,可以根据自己的需要修改部分代码: public BigDecimal getByAttributeName(ThmdGwqriR thmdGwqriR, String att ...

  8. Java 动态编译组件 & 类动态加载

    1.JDK6 动态编译组件 Java SE 6 之后自身集成了运行时编译的组件:javax.tools,存放在 tools.jar 包里,可以实现 Java 源代码编译,帮助扩展静态应用程序.该包中提 ...

  9. kafka java动态获取topic并动态创建消费者

    1.获取所有topic package com.example.demo; import java.io.IOException; import java.util.List; import org. ...

  10. Java如何获取当前类路径

    1.如何获得当前文件路径 常用: (1).Test.class.getResource("") 得到的是当前类FileTest.class文件的URI目录.不包括自己! (2).T ...

随机推荐

  1. 【OpenYurt 深度解析】边缘网关缓存能力的优雅实现

    简介: 阿里云边缘容器服务上线 1 年后,正式开源了云原生边缘计算解决方案 OpenYurt,跟其他开源的容器化边缘计算方案不同的地方在于:OpenYurt 秉持 Extending your nat ...

  2. [Go] Golang defer 与 MySQL 连接关闭的陷阱 (database is closed)

    在 golang 某些 orm 中,你经常会看到这种用法: func main() { db, err := gorm.Open("sqlite3", "test.db& ...

  3. WinDbg 设置在加载到某个 DLL 进入断点

    本文记录如何在 WinDbg 里,设置在加载到某个 DLL 时,自动进入断点.通过此方式用来定位是哪个业务模块加载了某个 DLL 模块 在 WinDbg 里面,可以附加到现有进程,也可以启动某个进程. ...

  4. dotnet 6 通过 DOTNET_ROOT 让调起的应用的进程拿到共享的运行时文件夹

    我的应用是独立发布的,在用户的设备上不需要额外去安装 .NET 运行时.但是我的应用有一个需求是下载另一个应用作为插件,由本应用调起插件进程.本文告诉大家如何解决调用插件的进程时,赋值给插件进程运行时 ...

  5. Docker基础 ubuntu安装docker

    目录 如何在Linux深度系统deepin下安装docker 介绍 安装docker 在ubuntu的docker中运行ubuntu 在ubuntu的docker中运行centos 卸载docker ...

  6. linux文本三剑客之grep及正则表达式详解

    linux文本三剑客之grep及正则表达式详解 目录 linux文本三剑客之grep及正则表达式详解 1. grep命令详解 2. 正则表达式 2.1 基本正则表达式 2.2 扩展正则表达式 1. g ...

  7. js中关于return和if条件处理

    好玩的 // if (true) { // return // } // // 不会打印 // console.log('1') // if (false) { // return // } // / ...

  8. Django国际化与本地化指南

    title: Django国际化与本地化指南 date: 2024/5/12 16:51:04 updated: 2024/5/12 16:51:04 categories: 后端开发 tags: D ...

  9. java基础 韩顺平老师的 异常 自己记的部分笔记

    443,异常处理入门 package com.hspedu.exception_; public class Exception { public static void main(String[] ...

  10. python的requests模块详解

    原文链接:https://www.cnblogs.com/lanyinhao/p/9634742.html 1.模块说明 requests是使用Apache2 licensed 许可证的HTTP库. ...