Spring学习笔记——Sprin管理Bean的原理

来源:互联网 发布:会计电算化软件下载 编辑:程序博客网 时间:2024/05/01 06:27

当我们使用Spring时候在Xml文件中通过

<bean id="service" class="com.finance.service.AmountServiceImpl" />

配置就可以操作该Bean的属性和方法,那么Spring到底是如何实现的呢?下面让我们自己实现这个过程。
首先我模拟Spring的命名方式创建一个Bean管理类MyClassPathXMLApplicationContext.java,代码如下:

// 自定义容器public class MyClassPathXMLApplicationContext {    private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();    private Map<String, Object> singletons = new HashMap<String, Object>();    public MyClassPathXMLApplicationContext(String filename){                // 1、读取配置文件        this.readXML(filename);                // 2、实例化Bean        this.instanceBeans();    }    /**     * 完成bean的实例化     */    private void instanceBeans() {        for(BeanDefinition beanDefinition : beanDefines){            try {                if(beanDefinition.getClassName()!=null && !"".equals(beanDefinition.getClassName().trim()))                    singletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassName()).newInstance());            } catch (Exception e) {                e.printStackTrace();            }        }    }    /**     * 读取xml配置文件     * @param filename     */    private void readXML(String filename) {           SAXReader saxReader = new SAXReader();               Document document=null;               try{             URL xmlpath = this.getClass().getClassLoader().getResource(filename);             document = saxReader.read(xmlpath);             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);//设置命名空间             List<Element> beans = xsub.selectNodes(document);//获取文档下所有bean节点              for(Element element: beans){                String id = element.attributeValue("id");//获取id属性值                String clazz = element.attributeValue("class"); //获取class属性值                        BeanDefinition beanDefine = new BeanDefinition(id, clazz);                beanDefines.add(beanDefine);             }               }catch(Exception e){                   e.printStackTrace();            }    }    /**     * 获取bean实例     * @param beanName     * @return     */    public Object getBean(String beanName){        return this.si呢gletons.get(beanName);    }}

配置文件如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">          <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"></bean></beans>

下面我们来测试一下:

public class SpringTest {    @BeforeClass    public static void setUpBeforeClass() throws Exception {    }    @Test public void instanceSpring(){        MyClassPathXMLApplicationContext ctx = new MyClassPathXMLApplicationContext("beans.xml");        PersonService personService = (PersonService)ctx.getBean("personService");        personService.save();    }}

运行成功

1 0
原创粉丝点击