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

2024-10-09 11:25:01 浏览数 (1)

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

1.定义枚举类MyServiceTypeEnum.java

代码语言:javascript复制
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

代码语言:javascript复制
package com.example.core.mydemo.bean;

public interface MyOrderImplOneService {
    /**
     * 获取类名称
     * @return
     */
    public String getClassName();
}

3.定义提交订单实现类 MySubmitOrderImplOneService.java

代码语言:javascript复制
package com.example.core.mydemo.bean;

public class MySubmitOrderImplOneService implements MyOrderImplOneService{
    @Override
    public String getClassName() {
        return "hello "   MySubmitOrderImplOneService.class.getName();
    }
}

4.定义取消订单实现类 MyCancelOrderImplOneService.java

代码语言:javascript复制
package com.example.core.mydemo.bean;

public class MyCancelOrderImplOneService implements MyOrderImplOneService{

    @Override
    public String getClassName() {
        return "hello "   MyCancelOrderImplOneService.class.getName();
    }
}

5.测试类

代码语言:javascript复制
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();
        }
    }
}

0 人点赞