`

剖析spring管理bean

阅读更多

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

 

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

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

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

 

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

 

1.         第一步,创建java project,引入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时,也是经过两大步:第一,服务启动解析配置文件,并保存配置文件中的元素;第二,实例化所有元素,并提供获取实例方法。

分享到:
评论

相关推荐

    Spring2.5视频教程_编码剖析Spring管理Bean的原理

    03_黑马程序员_黎活明_Spring2.5视频教程_编码剖析Spring管理Bean的原理

    搭建与测试Spring的开发环境和编码剖析Spring 管理Bean的原理

    这个是搭建与测试Spring的开发环境和编码剖析Spring 管理Bean的原理的代码,适合刚接触spring的人学习,如何搭建spring开发环境,以及了解spring是如何管理bean的。这个是由传智播客的老师讲的。

    spring2.5学习PPT 传智博客

    03_编码剖析Spring管理Bean的原理 04_Spring的三种实例化Bean的方式 05_配置Spring管理的bean的作用域 06_Spring管理的Bean的生命周期 07_编码剖析Spring依赖注入的原理 08_编码剖析Spring装配基本属性的原理 ...

    spring2.5教程(传智)

    03_编码剖析Spring管理Bean的原理 04_Spring的三种实例化Bean的方式 05_配置Spring管理的bean的作用域 06_Spring管理的Bean的生命周期 07_编码剖析Spring依赖注入的原理 08_编码剖析Spring装配基本属性的原理 09_...

    Spring及其各

    01_全面阐释Spring及其各项功能02_搭建与测试Spring的开发环境03_编码剖析Spring管理Bean的原理

    Spring技术内幕:深入解析Spring架构与设计原理

     国内第一本基于spring3.0的著作,从源代码的角度对spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从木书中参透spring框架的优秀架构和设计思想,而且还能从spring优雅的实现源码...

    深入解析Spring IoC源码:核心机制与实践应用

    本文深入探讨了Spring框架中IoC容器的源码机制,涵盖了容器的初始化、Bean工厂的实例化、Bean定义的读取及Spring Bean的生命周期管理。通过精细的分析,本文揭示了AnnotationConfigApplicationContext的实例化过程,...

    Spring技术内幕:深入解析Spring架构与设计原理(第2部分)

    国内第一本基于Spring3.0的著作,从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码...

    马士兵Spring源码剖析文档

    马士兵Spring源码剖析文档,详细讲解IOC容器,Bean对象的管理,AOP的详细过程,SpringMVC源码,Mybatis源码

    Spring+3.x企业应用开发实战光盘源码(全)

     第10章:对实际应用中Spring事务管理各种疑难问题进行透彻的剖析,让读者对Spring事务管理不再有云遮雾罩的感觉。  第11章:讲解了如何使用Spring JDBC进行数据访问操作,我们还重点讲述了LOB字段处理、主键产生...

    SPRING3技术内幕

    国内第一本基于Spring3.0的著作,从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码...

    【预习资料】Spring Boot 运行机制源码剖析1

    //初始化主要加载资源类集合并去重配置Spring Boot Bean源Java 配置 Class 或 XML 上下文配置文件集合,用于 Spring Boot

    Spring技术内幕:深入解析Spring架构与设计原理 1/2

     国内第一本基于spring3.0的著作,从源代码的角度对spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从木书中参透spring框架的优秀架构和设计思想,而且还能从spring优雅的实现源码...

    Spring.3.x企业应用开发实战(完整版).part2

    第10章 Spring的事务管理难点剖析 10.1 DAO和事务管理的牵绊 10.1.1 JDBC访问数据库 10.1.2 Hibernate访问数据库 10.2 应用分层的迷惑 10.3 事务方法嵌套调用的迷茫 10.3.1 Spring事务传播机制回顾 10.3.2 相互嵌套...

    Spring技术内幕:深入解析Spring架构与设计原理(第1部分)

    国内第一本基于Spring3.0的著作,从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码...

    Spring技术内幕:深入解析Spring架构与设计原理(第一部分)

    国内第一本基于Spring3.0的著作,从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码...

    Spring技术内幕:深入解析Spring架构与设计原理 2/2

     国内第一本基于spring3.0的著作,从源代码的角度对spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从木书中参透spring框架的优秀架构和设计思想,而且还能从spring优雅的实现源码...

    SPRING3技术内幕.z01

    国内第一本基于Spring3.0的著作,从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码...

Global site tag (gtag.js) - Google Analytics