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. windows下安装pywin32报错:close failed in file object destructor:sys.excepthook is missing lost sys.stderr

    今晚要写搜索引擎作业,搭scrapy环境,遇到了下面问题: windows下安装pywin32报错:close failed in file object destructor:sys.excepth ...

  2. github之克隆

    git clone --depth=10 git_仓库_url 只会获取最近 xx(10条提交记录的)代码,默认是master分支, 如果想要指定分支,可以结合 -b --single--branch ...

  3. python第九篇:Python进程

    Python进程 接下来我主要按照下图中思维导图上的关键点对进程和线程进行一个总结 进程知识点总结:   一.Python进程 1.概念 程序和进程: 程序:是可执行文件,是静态的,占据磁盘空间,程序 ...

  4. java中properties

    一.Java Properties类 Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置 ...

  5. stl_map.h

    stl_map.h // Filename: stl_map.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://blo ...

  6. POJ3080 POJ3450Corporate Identity(广义后缀自动机||后缀数组||KMP)

    Beside other services, ACM helps companies to clearly state their “corporate identity”, which includ ...

  7. Undefined exploded archive location(在myeclipse中TOMCAT不能发布程序。)

    原因:          在工程转移过程中,导致工程的配置文件出错: 解决方法:          1.在工程目录下的.mymetadata文件中可能webrootdir被改无效了(把下面内容拷到你的 ...

  8. 第二次C语言实验报告

    #一.设计题目,设计思路,实现方法 ##设计题目 15-10 找最长的字符串,14-5 指定位置输出字符串,13-6 数组循环右移,12-5 查找指定字符,11-5 打印杨辉三角. ##设计思路 15 ...

  9. js之翻牌游戏中的一个深刻感悟

    先“上菜”: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  10. RS485波特率问题

    转载请注明出处:http://blog.csdn.net/qq_26093511/article/details/51683648 最近再做一个项目,发现485不能发送数据,感到非常奇怪!后来查阅相关 ...