http://blog.csdn.net/yerenyuan_pku/article/details/52832434

在Spring的第一个案例中,我们已经知道了怎么将bean交给Spring容器进行管理,并且明白了怎么从Spring容器中获取bean。那我们就有一个疑问了:Spring是如何创建并管理bean的呢?现在我们就来编码剖析Spring管理Bean的原理。 
本文是在Spring的第一个案例的基础上展开的。 
我们要使用dom4j读取Sping的配置文件——beans.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.xsd"> <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"></bean> </beans>

那么就需要将dom4j所需的jar包导入该项目中。dom4j所需的jar包为:

  • dom4j-1.6.1.jar
  • jaxen-1.1-beta-6.jar

dom4j读取到诸如

<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"></bean>
  • 1
  • 1

这样的内容时,务必需要将读取到的bean的信息存到一个JavaBean对象中。于是我们可在junit.test包下创建这样一个JavaBean——BeanDefinition.java,其代码为:

/*** 将读取到的bean的信息存到一个JavaBean对象中* @author li ayun**/
public class BeanDefinition { private String id; private String className; public BeanDefinition(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; } }

接下来我们就创建一个传智播客版的Spring容器来模拟Spring容器。在junit.test下新建一个类——ItcastClassPathXMLApplicationContext.java,其代码如下:

/*** 传智播客版Spring容器* @author li ayun**/
public class ItcastClassPathXMLApplicationContext { private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>(); private Map<String, Object> sigletons = new HashMap<String, Object>(); public ItcastClassPathXMLApplicationContext(String filename) { this.readXML(filename); this.instanceBeans(); } /** * 完成bean的实例化 */ private void instanceBeans() { for (BeanDefinition beanDefinition : beanDefines) { try { if (beanDefinition.getClassName() != null && !"".equals(beanDefinition.getClassName().trim())) { sigletons.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.sigletons.get(beanName); } }

这样,传智播客版的Spring容器就创建出来了。接下来我们就要测试传智播客版的Spring容器是否能够取得bean实例,只须修改SpringTest类的代码为:

public class SpringTest {@Testpublic void test() { // ApplicationContext是接口 // ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); // 实例化Spring容器 // PersonService personService = (PersonService) ctx.getBean("personService"); // 从Spring容器取得bean // personService.save(); ItcastClassPathXMLApplicationContext ctx = new ItcastClassPathXMLApplicationContext("beans.xml"); // 实例化Spring容器 PersonService personService = (PersonService) ctx.getBean("personService"); // 从Spring容器取得bean personService.save(); } }

测试test()方法,Eclipse控制台打印如下: 
 
通过编写代码剖析Spring管理Bean的原理,我们就能深刻理解Spring内部到底是如何创建并管理bean实例的。源码可点击编码剖析Spring管理Bean的原理进行下载

转载于:https://www.cnblogs.com/telwanggs/p/6913026.html

(转)编码剖析Spring管理Bean的原理相关推荐

  1. (转)编码剖析Spring依赖注入的原理

    http://blog.csdn.net/yerenyuan_pku/article/details/52834561 Spring的依赖注入 前面我们就已经讲过所谓依赖注入就是指:在运行期,由外部容 ...

  2. (转)编码剖析Spring装配基本属性的原理

    http://blog.csdn.net/yerenyuan_pku/article/details/52856465 上回我们已经讲到了Spring依赖注入的第一种方式,现在我们来详解第二种方式,须 ...

  3. (转)编码剖析@Resource注解的实现原理

    http://blog.csdn.net/yerenyuan_pku/article/details/52860046 上文我们已经学会使用@Resource注解注入属性.学是学会了,但也仅限于会使用 ...

  4. 2014-03-09 Spring的学习(1)------Spring管理Bean(实例化Bean)

    2019独角兽企业重金招聘Python工程师标准>>> 1.搭建与测试Spring的开发环境 PS: Spring-beans-2.5.xsd  (为使在Beans.xml操作顺畅) ...

  5. 深入剖析Spring架构与设计原理(一)

    深入剖析Spring架构与设计原理(一) 1. IOC的基础 IOC/AOP是Spring的基础, 是Spring平台实现的核心部分. 虽然,我们一开始大多只是在这个层面上,做一些配置和外部特性的使用 ...

  6. aop的实现原理_非Spring管理Bean如何添加AOP呢?

    前几天有个朋友问了一个问题,觉得可以给大家分享一下. 问题如下图 归其根本这是个历史项目,里面有很多的类并没有交给spring管理,但现在需要统一添加日志. 面对这样的问题,其实只要了解AOP的原理, ...

  7. 天天用 Spring,bean 实例化原理你懂吗?

    来源:小小木的博客 www.cnblogs.com/wyc1994666/p/10650480.html 本次主要想写spring bean的实例化相关的内容.创建spring bean 实例是spr ...

  8. Spring 管理Bean(获取Bean,初始化bean事件,自动匹配ByName······等)

    1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] ApplicationContext ctx ...

  9. 采用Spring管理Bean和依赖注入

    1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] ApplicationContext ctx ...

最新文章

  1. Markdown基本语法【转】
  2. SVM的升维解决线性不可分
  3. python删除字符串中的空格保留一个_Python从字符串中隔开的字母中删除单个空格的最快方法...
  4. 【PAT甲级 约会】1061 Dating (20 分) C++ 全部AC
  5. Python调用Tushare抓取上证指数并作初步分析示例
  6. git fatal: index file smaller than expected
  7. cisco交换机MAC/CAW***防范
  8. 某大型银行深化系统技术方案之十四:服务层之服务调度机制
  9. python调用sql数据库_Python3操作SQL Server数据库(实例讲解)
  10. 014_SSS_High-Resolution Image Synthesis with Latent Diffusion Models
  11. 深入浅出学习Linux(基础知识一)
  12. 7个最好的文件存储网站
  13. 电容笔和Apple pencil的区别?适合ipad画画的电容笔推荐
  14. linux下shell命令之hwclock
  15. 存储器2-两种接口:LVTTL和STTL接口
  16. 计算机考研英语几,难度,2021考研:计算机考研难度排行榜
  17. 苹果电脑python编程软件下载_Python Mac软件下载-Python for Mac(Python编程工具) v3.10.0免费版 - Mac天空...
  18. 制作画中画视频的方法分享
  19. 桥牌坐庄训练bm2000 level3闯关记录——A7
  20. 314-哈夫曼树和哈夫曼编码

热门文章

  1. python 屏幕输入 读取两行_一节课带你掌握Python的输入输出
  2. 微信找不到nfc功能_苹果ios 14一周深度体验,这3个功能尤其好用,你还没发现吗?...
  3. python如何爬取sci论文_通过爬虫确定SCI期刊的发表周期
  4. 两数之和python哈希_LeetCode-python 1.两数之和
  5. GO string 转map_用go语言,只需两百行代码就能搞定并发聊天室!
  6. 初探nginx架构(100%)
  7. STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA
  8. 仓鼠大厦java下载_仓鼠大厦食盐宫殿 世界古怪酒店TOP10(组图)
  9. 虚拟内存的作用、分页系统实现虚拟内存原理
  10. [BZOJ3211] 花神游历各国 - 线段树