spring容器默认情况下,当服务启动时,解析配置文件,实例化文件中的所有类。

我们直接使用spring时,获取spring注入的bean是这样的,

ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");

MyService myService1 = (MyService) ctx.getBean("myService");

那下面我们模拟spring管理bean这个的过程,代码如下

1.         第一步,创建Javaproject,引入spring.jar

2.         创建spring.xml配置文件

<?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">

</beans>

3.         创建接口MyService,只需要一个测试方法save

4.         创建实现类MyServiceImpl,控制台输出一句话

5.         创建一个自己的解析类MyClassPathXmlApplicationContext

主要是构造方法中的两步

     // 装载实例化bean

        private Map<String, Object> beanMap = new HashMap<String, Object>();

        // 装载配置文件的属性和值

        private List<MyBeans> beanlist = new ArrayList<MyBeans>();

        public MyClassPathXmlApplicationContext(String filename) {

               //第一步,解析spring配置文件

               readXml(filename);

               //第二步,通过反射,实例化所有注入bean

               initBeans();

        }

        /**

         * 通过反射机制,初始化配置文件中的bean

         */

        private void initBeans() {

               for (MyBeans bean : beanlist) {

                      try {

                             if (bean.getClassName() != null && !"".equals(bean.getClassName())) {

                                    beanMap.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());

                             }

                      } catch (Exception e) {

                             e.printStackTrace();

                      }

               }

        }

        /**

         * 解析配置文件,把解析后的bean设置到实体中,并保持到list

         *

         * @param filename

         */

        private void readXml(String filename) {

               SAXReader reader = new SAXReader();

               Document doc = null;

               URL xmlpath = this.getClass().getClassLoader().getResource(filename);

               try {

                      Map<String, String> nsMap = new HashMap<String, String>();

                      nsMap.put("ns", "http://www.springframework.org/schema/beans");

                      doc = reader.read(xmlpath);

                      XPath xpath = doc.createXPath("//ns:beans//ns:bean");// 创建//ns:beans//ns:bean查询路径

                      xpath.setNamespaceURIs(nsMap);// 设置命名空间

                      List<Element> eles = xpath.selectNodes(doc);// 取得文档下所有节点

                      for (Element element : eles) {

                             String id = element.attributeValue("id");

                             String cn = element.attributeValue("class");

                             //自定义实体bean,保存配置文件中id和class

                             MyBeans beans = new MyBeans(id, cn);

                             beanlist.add(beans);

                      }

               } catch (Exception e) {

                      e.printStackTrace();

               }

        }

        public Object getBean(String beanId) {

               return beanMap.get(beanId);

        }

 6.         实体类

 package com.mooing.service;

 public class MyBeans {

        private String id;

        private String className;

        public MyBeans(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;

        }

 }

7.         测试

       MyClassPathXmlApplicationContext ctx = new MyClassPathXmlApplicationContext("spring.xml");

               MyService myService = (MyService) ctx.getBean("myService");

                myService.save();

总结:

自定义代码同样可以得到使用spring容器实例化的效果,也就是说,实际spring实例化管理bean时,也是经过两大步:第一,服务启动解析配置文件,并保存配置文件中的元素;第二,实例化所有元素,并提供获取实例方法。

【Sping管理bean的原理】的更多相关文章

  1. (转)编码剖析Spring管理Bean的原理

    http://blog.csdn.net/yerenyuan_pku/article/details/52832434 在Spring的第一个案例中,我们已经知道了怎么将bean交给Spring容器进 ...

  2. 编码剖析Spring管理bean的原理

    project目录 MyClassPathXMLApplicationContext读取xml,以及实例化bean. 因为是一开始实例化配置文件所有bean,所以需要构造器完成这些工作. packag ...

  3. Spring、编码剖析Spring管理Bean的原理

    引入dom4j jar包 1.新建Person接口和PersonBean public interface PersonIService { public void helloSpring(); } ...

  4. Spring第三弹—–编码剖析Spring管理Bean的原理

    先附一下编写的Spring容器的执行结果: 代码如下: 模拟的Spring容器类:   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  5. Spring中管理Bean以及解析XML

    Spring是分层的轻量级框架 以IoC(Inverse of Control 反转控制)和AOP(Aspect Oriented Programming 面向切面编程)为核心 应用Spring的好处 ...

  6. Spring是如何管理Bean

    容器是什么?spring中是如何体现的?一直有疑惑,这两天看了一下Spring管理bean的Demo,对于Spring中的容器有了简单的认识. 我们知道,容器是一个空间的概念,一般理解为可盛放物体的地 ...

  7. Sping中Bean配置的深入探讨

    一.p命名空间的使用 Spring 从 2.5 版本开始引入了一个新的 p 命名空间,可以通过 <bean> 元素属性的方式配置 Bean 的属性.使用 p 命名空间后,基于 XML 的配 ...

  8. Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结

    Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结 软件项目中的非法模块非法功能非法分子与人类中的非法分子很是相似,必须要建议不同的的约束管理标准化... 软 ...

  9. Spring4.0学习笔记(5) —— 管理bean的生命周期

    Spring IOC 容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务 Spring IOC 容器对Bean的生命周期进行管理的过程: 1.通过构造器或工厂方法 ...

随机推荐

  1. A股牛蹄板块轮动迹象

    2018年10月熊市末期牛市初期 1.券商 2.中小银行 3.稀土永磁 4.铁路基建 5.人工智能 6.电器仪表 7.保险 8.非进金融.供热供气

  2. python_unittest详解

    一 整体结构概览 unittest原名为PyUnit,是由java的JUnit衍生而来.对于单元测试,需要设置预先条件,对比预期结果和实际结果. 整体结构:unittest库提供了test cases ...

  3. 初学Linux笔记

    自动获取IP地址的局域网中,用的是DHCP服务器

  4. 实现stack 加上·getMin功能 时间复杂度为O(n)

    package com.hzins.suanfa; import java.util.Stack; /** * 实现stack 加上·getMin功能 时间复杂度为O(n) * @author Adm ...

  5. log4j报错ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

    ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only err ...

  6. hdu-5861 Road(并查集)

    题目链接: Road Time Limit: 12000/6000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Pro ...

  7. python中的生成器(generator)总结

    1.实现generator的两种方式 python中的generator保存的是算法,真正需要计算出值的时候才会去往下计算出值.它是一种惰性计算(lazy evaluation). 要创建一个gene ...

  8. 【leetcode刷题笔记】Validate Binary Search Tree

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  9. C++ STL, sort用法。

    在algorithm头文件中的sort可以给任意对象排序,包括内置类型和自定义类型,前提是定义了“<“运算符. sort(begin,end),表示一个范围,例如: #include" ...

  10. Linux 下网卡参数配置

    目录 Linux 下网卡参数配置 第一种:修改 interfaces 文件 网卡配置实例 回环参数配置 DHCP方式配置 静态 IP 地址分配 无线网卡配置 March 17, 2015 7:48 P ...