博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)编码剖析Spring管理Bean的原理
阅读量:5856 次
发布时间:2019-06-19

本文共 3412 字,大约阅读时间需要 11 分钟。

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

在Spring的第一个案例中,我们已经知道了怎么将bean交给Spring容器进行管理,并且明白了怎么从Spring容器中获取bean。那我们就有一个疑问了:Spring是如何创建并管理bean的呢?现在我们就来编码剖析Spring管理Bean的原理。 

本文是在Spring的第一个案例的基础上展开的。 
我们要使用dom4j读取Sping的配置文件——beans.xml

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

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

dom4j读取到诸如

  • 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
beanDefines = new ArrayList
(); private Map
sigletons = new HashMap
(); 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
nsMap = new HashMap
(); nsMap.put("ns", "http://www.springframework.org/schema/beans"); // 加入命名空间 XPath xsub = document.createXPath("//ns:beans/ns:bean"); // 创建beans/bean查询路径 xsub.setNamespaceURIs(nsMap); // 设置命名空间 List
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 {    @Test    public 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实例的。源码可点击进行下载

你可能感兴趣的文章
我的友情链接
查看>>
zabbix3.0.4发邮件小坑一个
查看>>
现在大学生学哪种语言比较好
查看>>
Centos 配置多个虚拟IP
查看>>
关于PullToRefreshListView的使用
查看>>
bat格式化时间
查看>>
Linux xargs命令
查看>>
Azure 中国篇之计算服务—两个订阅间的×××配置
查看>>
ECMAScript 6 Promises(下):谈谈 API(一)
查看>>
FastJson 格式化输出Double,保留精度
查看>>
CSS3 transition实现超酷动画效果
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
2015年读书单
查看>>
不是博眼球,上交会的人工智能产品有的已上岗有的正“裂变”
查看>>
容灾的相关知识
查看>>
linux查看端口占用情
查看>>
hive数字处理
查看>>
索引优化系列十三--分区表各类聚合优化玄机
查看>>
LDAP+SAMBA(SAMBA安装篇-实现PDC)
查看>>