首页 > 编程语言 >Java动态获取实现类 Class.forName(clazz).newInstance()和applicationContext.getBean, bean Map寻找方式,Java Map定义和初

Java动态获取实现类 Class.forName(clazz).newInstance()和applicationContext.getBean, bean Map寻找方式,Java Map定义和初

时间:2024-06-06 19:56:46浏览次数:18  
标签:Map return name newInstance public MyOrderImplOneService bean Java class

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();
        }
    }
}

 

标签:Map,return,name,newInstance,public,MyOrderImplOneService,bean,Java,class
From: https://www.cnblogs.com/oktokeep/p/18235912

相关文章

  • 【网络安全的神秘世界】JavaScript
    ......
  • 【JavaScript详解】Day02
    JavaScript基础-第2天理解什么是流程控制,知道条件控制的种类并掌握其对应的语法规则,具备利用循环编写简易ATM取款机程序能力运算符语句综合案例运算符算术运算符数字是用来计算的,比如:乘法*、除法/、加法+、减法-等等,所以经常和算术运算符一起。算术运算......
  • Shadow Map(阴影贴图)跟Soft Shadows(软阴影)
    Shadowmapping(阴影贴图)是一种常用的实时阴影生成技术,广泛应用于计算机图形学、游戏引擎和其他实时渲染系统中。它用于创建场景中物体的阴影,从而增加画面的真实感和深度感。阴影贴图的基本原理阴影贴图技术的基本思想是使用一个深度图(depthmap)来记录光源视角下场景中每个像素到......
  • 从零开始的.NET项目(一)仓储模式与配置AutoMapper
    目标框架:.net6.0操作系统:macos编译器:Rider内容:创建第一个Controller,使用仓储(Respository)模式实现,并使用AutoMapper进行数据对象关系映射非常简单的实现,Automapper也只介绍了最基础也最常用的其他用法后续再补,目的就是稳准狠......
  • 【入门教程】5分钟教你快速学会集成Java springboot ~
    介绍ApacheDolphinScheduler是一个分布式易扩展的开源分布式调度系统,支持海量数据处理,具有任务流程调度、任务流程编排、任务监控告警、工作流引擎等功能。本文将介绍如何将ApacheDolphinScheduler集成到JavaSpringboot项目中,以实现更灵活和便捷的调度功能。步骤步骤一:添......
  • vue+java实现大文件上传解决方案
    分片上传大文件Demo为了实现分片上传,包括断点续传和重试机制,我们可以使用Vue.js作为前端,SpringBoot作为后端。这个方案包括以下步骤:前端:使用Vue.js进行文件分片上传。管理分片上传的进度和状态,处理断点续传和重试。后端:使用SpringBoot处理分片上传的请求。存储上......
  • 【忻州师范学院毕业论文】基于Java的家政公司网站的设计与实现
    注:仅展示部分文档内容和系统截图,需要完整的视频、代码、文章和安装调试环境请私信up主。1.1 开发背景及研究意义随着我国人口的增长、人们生活水平的提高,居民社会需求也随之增多,市场经济的快速发展和信息化水平的不断提高,人们的工作节奏也不断加快,许多人们没有闲暇的时间和......
  • Java文件操作 获取文件扩展名
    publicclassFilenameUtil{/**Java文件操作获取文件扩展名**Createdon:2011-8-2*Author:blueeagle*/publicstaticStringgetExtensionName(Stringfilename){if((filename!=null)&&(filename.length()>0)){intdot=f......
  • Java (Docker MySql)
    前沿加油每天进步一点就是无敌可以去官网下载Docker yuminstall-ydocker重启刷新停止sudosystemctlstartdockersudosystemctlstopdockersudosystemctlrestartdocker哈可以装客户端端dcocker直接安装就完事了  然后安装mysql然后遇到这样的......
  • Java定义常量的几种方法
    方法一采用接口(Interface)的中变量默认为staticfinal的特性。方法二采用了Java5.0中引入的Enum类型。方法三采用了在普通类中使用staticfinal修饰变量的方法。方法四类似方法三,但是通过函数来获取常量。/***MethodOne*/interfaceConstantInterface{StringSUNDAY=......