zoukankan      html  css  js  c++  java
  • 实现一个自己的IOC

    实现一个自己的IOC
    package com.IocExample;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    /***
     * @description: IoC容器例子
     * @author: 
     * @create: 2019-08-09 15:40
     *
     * 1、实例化bean
     * 2、保存bean
     * 3、提供bean
     * 4、每一个ben要产生一个唯一的id与之相呼应
     **/
    public class IoCContainer {
    
        private Map<String, Object>  beans = new ConcurrentHashMap<String, Object>();
    
        /**
         * 根据beanId获取一个bean
         * @param beanId
         * @return 返回Bean
         */
        public Object getBean(String beanId){
            return beans.get(beanId);
        }
    
        /**
         * 委托IoC容器创建一个Bean
         * @param clazz 要创建的bean的class
         * @param beanId beanId
         * @param paramBeanId 要创建的bean的class的构造方法所需要的参数的beanId们(依赖的beanId)
         */
        public void setBean(Class<?> clazz, String beanId,String... paramBeanId){
    
            //1组装构造方法所需要的参数值--获取依赖bean
            Object[] paramValues = new Object[paramBeanId.length] ;
            for (int i = 0; i < paramBeanId.length; i++){
                paramValues[i] = beans.get(paramBeanId[i]);
                System.out.println("paramValues["+ i + "] =" + paramValues[i]);
            }
            //2、调用构造方法实例化bean
            Object bean = null;
            //获取所有构造函数
            for (Constructor<?> constructor : clazz.getConstructors()) {
                try{
                    bean = constructor.newInstance(paramValues);
                } catch (IllegalAccessException e) {
                } catch (InstantiationException e) {
                } catch (InvocationTargetException e) {
                }
                if (bean == null){
                    throw new RuntimeException("找不到合适的构造方法");
                }
            }
            //3、将实例化的bean放入beans
            beans.put(beanId, bean);
        }
    }
    

      




  • 相关阅读:
    AndRodi Strudio中的按钮时件
    Intent(三)向下一个活动传递数据
    Intent(二)隐式调用intent
    用PopupWindow做下拉框
    环形进度条
    Android Studio分类整理res/Layout中的布局文件(创建子目录)
    Android无需申请权限拨打电话
    使用ViewPager切换Fragment时,防止频繁调用OnCreatView
    定制 黑色描边、白色背景、带圆角 的背景
    Android 底部弹出Dialog(横向满屏)
  • 原文地址:https://www.cnblogs.com/wangcp-2014/p/11329382.html
Copyright © 2011-2022 走看看