小黑J2EE学习ing
我很会努力
BlogJava
首页
新随笔
联系
聚合
管理
随笔-21 评论-29 文章-0 trackbacks-0
小黑Spring学习(三) 编码剖析Spring管理Bean的原理
通过第一个实例我们会有一个疑问,Spring到底是怎么管理Bean的呢?
我们来模拟Spring的内部实现
在junit.test下新建
ItcastClassPathXMLApplicationContext
类
类的完全代码(这里要引入dom4j的jar包)
package
junit.test;
import
java.net.URL;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.HashSet;
import
java.util.List;
import
java.util.Map;
import
org.dom4j.Document;
import
org.dom4j.Element;
import
org.dom4j.XPath;
import
org.dom4j.io.SAXReader;
/** */
/**
* 传智传客版容器
*
*/
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);
}
}
新建
BeanDefinition
,用来存放bean里面的两个属性 id 和 className。
package
junit.test;
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;
}
}
修改SpringTest代码 测试程序
package
junit.test;
import
org.junit.BeforeClass;
import
org.junit.Test;
import
cn.itcast.service.PersonService;
public
class
SpringTest
{
@BeforeClass
public
static
void
setUpBeforeClass()
throws
Exception
{
}
@Test
public
void
instanceSpring()
{
ItcastClassPathXMLApplicationContext ctx
=
new
ItcastClassPathXMLApplicationContext(
"
beans.xml
"
);
PersonService personService
=
(PersonService)ctx.getBean(
"
personService
"
);
personService.save();
}
}
执行测试 控制台输出为
说明我们新建的传智播客容器取到了bean实例 并成功地调用了save方法
通过实例,我们就可以理解Spring是创建和管理bean的!
小黑spring学习源代码
参考源代码
posted on 2009-05-06 14:03
特立独行
阅读(440)
评论(0)
编辑
收藏
所属分类:
Spring框架
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
Spring 框架的设计理念与设计模式分析(2)
小黑Spring学习(四)
小黑Spring学习(三) 编码剖析Spring管理Bean的原理
小黑Spring学习(二)
小黑Spring学习(一)
小黑J2EE学习之路 欢迎大家观临! 希望大家能多指教哦!
<
2024年12月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔分类
Hibernate框架(6)
J2EE核心技术(1)
Java 技术
Java面试题
Spring框架(5)
Struts框架(7)
数据库
随笔档案
2010年6月 (2)
2009年6月 (1)
2009年5月 (17)
2009年4月 (1)
搜索
最新评论
1. re: struts2实现文件上传和下载[未登录]
下载做来直接就在页面把文件打开了。。
--小菜
2. re: struts2实现文件上传和下载
你这代码量有点多,STRUTS2封装好了,顶多15行搞定
--你这代码量有点多
3. re: struts2实现文件上传和下载
怎么将上传的东西在页面上显示出来啊
--边城
4. re: struts2实现文件上传和下载
配置的文件 有关键字, 把action 中的name 换下就可以了 @陈
--采用
5. re: struts2实现文件上传和下载
大侠 ……怎么实现点一个文件下载一个文件,而不是固定的文件?
--pppppppppp
阅读排行榜
1. struts2实现文件上传和下载(17507)
2. 小黑struts学习(五) Action Mapping、ActionForward和ActionForm组件学习(1592)
3. 小黑Hibernate学习(三) Session接口及get、load、persist方法(1004)
4. ASSH框架的技术基础和设计(756)
5. Spring 框架的设计理念与设计模式分析(646)
评论排行榜
1. struts2实现文件上传和下载(27)
2. Spring 框架的设计理念与设计模式分析(1)
3. 很开心加入BlogJava 就像找到了组织一样(1)
4. Spring 框架的设计理念与设计模式分析(2)(0)
5. JFreeChart的中文乱码问题 知道的帮忙解决一下(0)