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. 登陆获取shell时的配置文件加载过程

    最近遇到一台ubuntu服务器登陆时默认语言环境变量变成posix问题, 导致中文显示乱码,影响程序的正常运行 # locale LANG= LANGUAGE= LC_CTYPE="POSI ...

  2. log4net性能小探

    初步测试了Log4性能.Appender架构如下. 一般客户端,使用FileAppender,把Log记录在本地磁盘. <lockingModel type="log4net.Appe ...

  3. java深入探究07-jdbc下

    1.BeanUtils组件 1)使用:导入commons-beanutils-1.8.3.jar核心包,日志支持包: commons-logging-1.1.3.jar 缺少日志的jar文件报错:ja ...

  4. python爬取某个网站的图片并保存到本地

    python爬取某个网站的图片并保存到本地 #coding:utf- import urllib import re import sys reload(sys) sys.setdefaultenco ...

  5. django 使用内建过滤器实现文章摘要效果

    django 使用内建过滤器实现文章摘要效果 前端html代码 <div class="list-group"> {% if articles %} {% for ar ...

  6. 如何让DIV可编辑、可拖动

    1.可编辑: <div id="move" contentEditable="true">可编辑</div> 设置contentEdit ...

  7. AngularJS学习笔记(二) 表单验证案例(ng-repeat/filter)

    这一节相对来说需要理解的东西不是太多,记住了那些api就行了. 还是一个案例(同样来自miaov),一个表单验证,先上代码,然后再对对应的内容进行解释. <!DOCTYPE html> & ...

  8. spring事务隔离级别以及脏读 不可重复读 幻影读

    隔离级别 声明式事务的第二个方面是隔离级别.隔离级别定义一个事务可能受其他并发事务活动活动影响的程度.另一种考虑一个事务的隔离级别的方式,是把它想象为那个事务对于事物处理数据的自私程度. 在一个典型的 ...

  9. png8 png24 png32

    解释 PNG8 : 8位的PNG最多支持256(2的8次方)种颜色,8位的PNG支持不透明.索引透明.alpha透明. PNG24 : 支持2的24次方种颜色,表现为不透明.PS导出PNG24是会根据 ...

  10. ACM学习历程—HDU4417 Super Mario(树状数组 && 离线)

    Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping ability re ...