自己动手写spring(二) 创建一个bean工厂

前言

前文虽然以spring配置文件的样式,根据配置文件搞了一个类出来,但离工具化的应用还很远,本文再进一步。

处理类之间的关系

前文的例子只创建了较为简单的beanB类,现在我们创建beanA类。从模仿spring beanFactory的getBean方法开始。

public class Main3 {
    // 根据beans类构建id到bean对象(注意不是beanA和beanB)的映射。不然根据id获取Bean对象太麻烦
    public static Map<String, Bean> beanMap = new HashMap<String, Bean>();
    public static void load(){
        // 前文的所有代码
    }
    public static Object getBean(String beanId) throws Exception {
        Object obj = null;
        Bean bean = beanMap.get(beanId);
        // 创建类对象
        Class clazz = Class.forName(bean.getClassName());
        obj = clazz.newInstance();
        List<Property> props = bean.getProps();
        for (Property prop : props) {
            String methodName = "set" + bigCaseFirstChar(prop.getName());
            // 为一般属性赋值
            if (null != prop.getValue()) {
                Method m = clazz.getMethod(methodName, String.class);
                m.invoke(obj, prop.getValue());
            }
            // 为对象属性赋值
            if (null != prop.getRef()) {
                Bean chileBean = beanMap.get(prop.getRef());
                Class childClazz = Class.forName(chileBean.getClassName());
                Method m = clazz.getMethod(methodName, childClazz);
                // 递归调用
                Object childObj = getBean(chileBean.getId());
                m.invoke(obj, childObj);
            }
        }
        return obj;
    }
    public static void main(String[] args) {
        try {
            load();
            System.out.println("test=================================================>");
            BeanA beanA = (BeanA) getBean("beanA");
            System.out.println(beanA.getTitle());
            System.out.println(beanA.getBeanB().getTitle());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

是不是已经有spring的感觉啦,不过,我们还需要将创建好的bean保存起来,同时,将上述代码包装为一个util类。

public class BeanUtil {
    public static Beans beans;
    // 保存id到bean对象的映射
    public static Map<String, Bean> beanMap = new HashMap<String, Bean>();
    // 保存id到对象的映射,这个map就很有容器的意思啦
    public static Map<String, Object> objMap = new HashMap<String, Object>();
    static {
        try {
            load();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Object getBean(String beanId) throws Exception {
        // 先看下map中有没有
        Object obj = objMap.get(beanId);
        if (obj != null) {
            return obj;
        }
        // 跟上面代码重复,省略
        if (obj != null) {
            objMap.put(beanId, obj);
        }
        return obj;
    }
    public static void main(String[] args) {
        try {
            System.out.println("test=================================================>");
            BeanA beanA = (BeanA) BeanUtil.getBean("beanA");
            System.out.println(beanA.getTitle());
            System.out.println(beanA.getBeanB().getTitle());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这个beanUtil就是一个简单的bean工厂啦,有时间,我提供下支持注解的版本。

转载于:https://www.cnblogs.com/qiankunli/p/4941070.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值