Spring bean 原理

来源:互联网 发布:上海交大网络学校 编辑:程序博客网 时间:2024/06/10 19:50

存放Java类的id和类地址

package javaBeanYuanLi;public class BeanDefintion {    private String id;    private String className;    public BeanDefintion(String id, String className) {        this.id = id;        this.className = className;    }    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getClassName() {        return className;    }    public void setClassName(String className) {        this.className = className;    }}

MyTestClassPathXMLapplicationContext类模仿了Spring 容器,仔细分析其中的代码,可以知道,在这个容器类中,我主要做了以下几个步骤:
1. 读取xml配置文件, 数据封装到BeanDefinition。

    2. 将BeanDefinition对象存入list。    3. 遍历list, 通过反射产生对象并存入map。    4. 调用getBean方法返回一个bean对象, 此bean对象为单例。    读取xml配置文件时,我采用的是dom4j 的sax方法,并且通过xpath来匹配xml文档中的节点。因此我们需要在项目中引入两个jar包:dom4j-1.6.1.jar、jaxen-1.1-beta-6.jar。将这两个jar扔到项目的lib文件夹下即可。当我们解析完成xml文档,并且将xml文档中<bean>节点所配置的信息封装到BeanDefinition对象中时,接下来容器会通过这些封装的配置信息,通过反射技术,实例化bean对象,并存入一个Map集合。容器提供了一个getBean方法,在容器外部可以获取到实例化后的bean对象。         容器类已经模仿好了,那么接下来需要进行实例测试了。事先我定义了一个接口,并且编写实现类实现了这个接口,代码如下。  
package javaBeanYuanLi;import java.net.URL;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.XPath;import org.dom4j.io.SAXReader;/** *  * 容器:模拟Spring容器 * @author Administrator *  *        * */public class MyTestClassPathXMLApplicationContext {    //存放BeanDefintion 对象的集合    private List<BeanDefintion> beanDefintions = new ArrayList<BeanDefintion>();    //存放实例化后的bean对象    private Map<String, Object> singletons = new HashMap<String, Object>();    /**     * 容器构造方法:用于读取配置文件     * @param resource     */    public MyTestClassPathXMLApplicationContext(String resourceName){        //读取配置文件,并将bean的配置信息放入集合中        this.readXML(resourceName);        //实例化bean        this.instanceBean();    }    /**     * 根据xml资源名称读取xml文件     * @param resourceName     */    public void readXML(String resourceName){        //采用dom4j  的SAX方式读取xml配置文件        SAXReader saxReader = new SAXReader();        Document document = null;        try {            URL xmlPath = this.getClass().getClassLoader().getResource(resourceName);//获取资源路径            document = saxReader.read(xmlPath);//读取路径的文件,实例化xml文档对象            /**             * 采用xpath 匹配查询xml文档节点             */            //增加XPath的命名空间            Map<String, String> nsMap = new HashMap<String, String>();            nsMap.put("ns", "http://www.springframework.org/schema/beans");            XPath  xsub =  document.createXPath("//ns:beans/ns:bean");//创建beans/bean的查询路径            //设置 命名空间             xsub.setNamespaceURIs(nsMap);            //匹配解析xml文档对象,返回beans.xml文件中bean配置信息节点            List<Element> beans  = xsub.selectNodes(document);            //遍历获取bean配置信息,实例化BeanDefintion对象            for(Element bean : beans){                String id  = bean.attributeValue("id");//id属性值                String clazz = bean.attributeValue("class");//class属性值                //创建BeanDefintion 对象                BeanDefintion beanDefintion = new  BeanDefintion(id,clazz);                //bean配置对象方法集合中                beanDefintions.add(beanDefintion);            }        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    /**     * 通过 反射集合实例化bean     */     private void instanceBean() {        for(BeanDefintion beanDefintion : beanDefintions){            try {                if(beanDefintion.getClassName() !=null && !"".equals(beanDefintion.getClassName().trim())){                    singletons.put(beanDefintion.getId(), Class.forName(beanDefintion.getClassName()).newInstance());                }            } catch (Exception e) {                e.printStackTrace();            }         }    }    /**     * 根据id获取bean对象     * @param id     * @return     */    public Object getBean(String key){        return singletons.get(key);    }}
public interface StudentService {    public void save();    public void say();}package javaBeanYuanLi;public class StudentServiceImpl implements StudentService {    public void save() {        System.out.println("我是一个保存方法");    }    public void say() {        System.out.println("我是一个学生,我要抓住凹凸曼!!!");    }}
package javaBeanYuanLi;import org.junit.Test;import org.springframework.test.context.TestExecutionListeners;import com.opensymphony.xwork2.interceptor.annotations.After;import com.opensymphony.xwork2.interceptor.annotations.Before;/** * 测试类 * @author Administrator * */public class JunitTest {    @Before    public void star() {        System.out.println("开始测试");    }    @After    public  void end() {       System.out.println("测试结束");    }    @Test    public void testMyIoc(){        /**         * 模仿IOC         */        try{             把bean实例化都存起来,放到map中            MyTestClassPathXMLApplicationContext context  = new MyTestClassPathXMLApplicationContext("beans.xml");            StudentService  studentService = (StudentService)context.getBean("studentService");        }catch (Exception e) {            // TODO: handle exception        }    }