`
coolszy
  • 浏览: 1407074 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Spring学习笔记(3)----编码剖析Spring管理Bean的原理

阅读更多
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:context="http://www.springframework.org/schema/context"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
		<bean id="userBean" class="com.szy.spring.implbean.UserBean" />
</beans>

 

Spring的配置文件中记录了类的包路径,因此我们首先是要读入配置文件。在配置文件中Bean有id和class两个属性,我们首先定义一个Bean类,包含这两个属性:

 

package com.szy.spring.implbean;

public class Bean
{
	private String id;
	private String 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;
	}
	
}
 

由于配置文件是xml文件,在这里使用Jdom包操作xml文件,读入配置文件中的Bean信息。

/**
	 * 读取xml配置文件
	 * @param fileName 配置文件名
	 */
	private void readXML(String fileName)
	{
		// 寻找配置文件
		URL xmlPath = this.getClass().getClassLoader().getResource(fileName);
		Document doc = null;
		Element root = null;
		try
		{
			SAXBuilder sb = new SAXBuilder(false);
			doc = sb.build(new FileInputStream(new File(xmlPath.toURI())));
			// 设置命名空间
			Namespace xhtml = Namespace.getNamespace("xhtml",
					"http://www.springframework.org/schema/beans");
			root = doc.getRootElement(); // 获取根元素
			List<Element> list = root.getChildren("bean", xhtml); //获取全部bean节点
			for (Element element : list)// 遍历节点,取得每个节点的属性
			{
				String id = element.getAttributeValue("id");
				String className = element.getAttributeValue("class");
				Bean bean = new Bean();
				bean.setId(id);
				bean.setClassName(className);
				beanList.add(bean);
			}
		} catch (Exception e)
		{
			e.printStackTrace();
		}

	}

 

 其中beanList是一个List对象,因为在配置文件中存在很多Bean。

 

得到了所有的Bean对象后,下面就实例化每个Bean对象,结果存放在Map对象中。

 

/**
	 * bean的实例化
	 */
	private void instanceBeans()
	{
		for (Bean bean : beanList)
		{
			try
			{
				if (bean.getClassName() != null && !"".equals(bean.getClassName().trim()))
					beanObject.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());
			} catch (Exception e)
			{
				e.printStackTrace();
			}
		}

	}

 其中beanObject为Map对象。

 

最后再加入一个方法,方便外部能获取Map中的对象

/**
	 * 获取bean实例
	 * @param beanName 配置文件中bean的Id
	 * @return
	 */
	public Object getBean(String beanName)
	{
		return this.beanObject.get(beanName);
	}

 完整的MyClassPathXMLApplicationContext见附件中的代码。

 

下面测试MyClassPathXMLApplicationContext类。

@Test
	public void testMethod() throws Exception
	{
		//读取配置文件
		MyClassPathXMLApplicationContext ctx=new MyClassPathXMLApplicationContext("applicationContext.xml");
		//获取UserBean的实例
		PersonBean bean=(PersonBean)ctx.getBean("userBean");
		//调用方法
		bean.show();
	}

 

输出结果

Hello Kuka

 

成功。

上面仅是简单的演示了Spring管理Bean的原理,但是在实际操作中还需要考虑很对其它因素。

5
0
分享到:
评论
3 楼 leejon 2009-12-09  
coolszy 写道
leejon 写道
感觉好像××播客的Spring2.5视频教程。这个标题都和视频文件夹一样。第三章的内容吧。
不过只要学懂了就是自己的了。不管黑猫白猫,抓得到老鼠的就是好猫。加油。

呵呵,就是的,不过还加上尚学堂科技_王勇_Spring的教程


个人觉得王勇老师讲得很好。语调啊很不错。马士兵的也蛮不错的。
至少比我们学校那些讲师强多了。
加油。
2 楼 coolszy 2009-11-23  
leejon 写道
感觉好像××播客的Spring2.5视频教程。这个标题都和视频文件夹一样。第三章的内容吧。
不过只要学懂了就是自己的了。不管黑猫白猫,抓得到老鼠的就是好猫。加油。

呵呵,就是的,不过还加上尚学堂科技_王勇_Spring的教程
1 楼 leejon 2009-11-23  
感觉好像××播客的Spring2.5视频教程。这个标题都和视频文件夹一样。第三章的内容吧。
不过只要学懂了就是自己的了。不管黑猫白猫,抓得到老鼠的就是好猫。加油。

相关推荐

Global site tag (gtag.js) - Google Analytics