Link to Spring II Start programming Spring - HITSUN2015/Util GitHub Wiki

关于 Spring的开发目的 Spring 的创始人 Rod Johnson,大概意在,简化ERP的开发 我理解的主要目的是,不需要程序员去维护各种各样的对象,我来帮你管,你只需要管理对象之间的调用即可。 所以本系列文章 以此为目的,实现从0到spring的过程。

我来管理对象 所以最基础的想法是: 把所有对象 抽象为一个类型,由于java 在过去 web开发时,传输对象叫javaBean,不妨我们起个叫Bean的,这样我们把用户的对象 叫做bean,用户的bean到底啥样,都有啥属性,怎么用抽象的方法描述用户的所有bean那?所以,起了一个类,来描述所有用户的bean对象:BeanDefination; 好了 现在轮到我们拍脑瓜子来想怎么瞎编代码了,要描述一个bean,换言之要描述一个类,我们就得知道一个类都有啥玩意。。。 一个类有啥?随意找个类过滤瞅呗,从上往下:包名(提供了 类文件位置)、依赖的类名、类名、接口、父类、属性、方法, AbstractBeanFactory 说实话 刚看代码时,我以为我思路完全跑偏了。。。 (实际上也确实跑偏了,我们要想得到一个对象,仅需要得到class文件,而不是由class的各个属性,来组装成一个对象,各个属性,是用来修改生成具体对象的具体值的,所以BeanDefination,需要能提供具体的class即可。) 我们要想帮用户生成对象,是的,我们得有class,所以这个类,得提供class,this.beanClass是用来持有class的,过程是通过类名,resolve,这个词,查字典说解决,解决你妹啊。现在给改成 解析,是通过类名,解析成class文件,要是我就全说成映射,是类名到类的映射。 public Class<?> resolveBeanClass(@Nullable ClassLoader classLoader)

我们来管理所有Bean对象,所以,我们得有个容器,对,总听说工厂模式,这里不提工厂模式,你想管理一堆孩子需要一个屋子,换言之 需要一个容器,需要一个环境。所以,我们给这个用来装各种bean对象的容器 叫 BeanFactory。 现在来想这个容器,需要提供什么样的功能,我们首先想到的就是数据的容器:数据库,一般会提供 增删改查,所以,我们的BeanFactory不妨也提供增删改查功能: 增: 删:public void destroyBean(String beanName, Object beanInstance) 改: 查:public Object getBean(String name) public T getBean(String name, @Nullable Class requiredType) public Object getBean(String name, Object... args) public T getBean(String name, @Nullable Class requiredType, @Nullable Object... args)

最简单的 spring实现: package bean;

import java.util.*;

/**

  • Created by Sunny on 17/10/25.

  • 这个类 负责 将 class 文件转换成 类对象 */ public class BeanFactory {

    public BeanFactory() { }

    private Map<String, Object> beanObjectMap = new HashMap<>();//单例 private Set classPathList = new HashSet<>();

    public Object getBean(String name) throws Exception { Object result = null; if (beanObjectMap.containsKey(name)) { result = beanObjectMap.get(name); } else if (classPathList.contains(name)) { Class aClass = transformName2Class(name); result = transformClass2Object(aClass); } else { throw new Exception("该类不在需要维护的class范围内: " + name); } return result; }

    private Class transformName2Class(String name) { Class result = null; try { result = Class.forName(name); } catch (ClassNotFoundException e) { e.printStackTrace(); } return result; }

    private Object transformClass2Object(Class clz) { Object result = null; try { result =clz.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return result; }

    public void setClassPathList(Set classPathList) { this.classPathList = classPathList; } }

⚠️ **GitHub.com Fallback** ⚠️