`

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

阅读更多
Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.         xmlns:context="http://www.springframework.org/schema/context"  
  5.         xmlns:tx="http://www.springframework.org/schema/tx"  
  6.         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  7.                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd   
  8.                 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  9.         <bean id="userBean" class="com.szy.spring.implbean.UserBean" />  
  10. </beans>  
<?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类,包含这两个属性:

 

Java代码 复制代码
  1. package com.szy.spring.implbean;   
  2.   
  3. public class Bean   
  4. {   
  5.     private String id;   
  6.     private String className;   
  7.     public String getId()   
  8.     {   
  9.         return id;   
  10.     }   
  11.     public void setId(String id)   
  12.     {   
  13.         this.id = id;   
  14.     }   
  15.     public String getClassName()   
  16.     {   
  17.         return className;   
  18.     }   
  19.     public void setClassName(String className)   
  20.     {   
  21.         this.className = className;   
  22.     }   
  23.        
  24. }   
  25.    
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信息。

Java代码 复制代码
  1. /**  
  2.      * 读取xml配置文件  
  3.      * @param fileName 配置文件名  
  4.      */  
  5.     private void readXML(String fileName)   
  6.     {   
  7.         // 寻找配置文件   
  8.         URL xmlPath = this.getClass().getClassLoader().getResource(fileName);   
  9.         Document doc = null;   
  10.         Element root = null;   
  11.         try  
  12.         {   
  13.             SAXBuilder sb = new SAXBuilder(false);   
  14.             doc = sb.build(new FileInputStream(new File(xmlPath.toURI())));   
  15.             // 设置命名空间   
  16.             Namespace xhtml = Namespace.getNamespace("xhtml",   
  17.                     "http://www.springframework.org/schema/beans");   
  18.             root = doc.getRootElement(); // 获取根元素   
  19.             List<Element> list = root.getChildren("bean", xhtml); //获取全部bean节点   
  20.             for (Element element : list)// 遍历节点,取得每个节点的属性   
  21.             {   
  22.                 String id = element.getAttributeValue("id");   
  23.                 String className = element.getAttributeValue("class");   
  24.                 Bean bean = new Bean();   
  25.                 bean.setId(id);   
  26.                 bean.setClassName(className);   
  27.                 beanList.add(bean);   
  28.             }   
  29.         } catch (Exception e)   
  30.         {   
  31.             e.printStackTrace();   
  32.         }   
  33.   
  34.     }  
/**
	 * 读取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对象中。

 

Java代码 复制代码
  1. /**  
  2.      * bean的实例化  
  3.      */  
  4.     private void instanceBeans()   
  5.     {   
  6.         for (Bean bean : beanList)   
  7.         {   
  8.             try  
  9.             {   
  10.                 if (bean.getClassName() != null && !"".equals(bean.getClassName().trim()))   
  11.                     beanObject.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());   
  12.             } catch (Exception e)   
  13.             {   
  14.                 e.printStackTrace();   
  15.             }   
  16.         }   
  17.   
  18.     }  
/**
	 * 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中的对象

Java代码 复制代码
  1. /**  
  2.      * 获取bean实例  
  3.      * @param beanName 配置文件中bean的Id  
  4.      * @return  
  5.      */  
  6.     public Object getBean(String beanName)   
  7.     {   
  8.         return this.beanObject.get(beanName);   
  9.     }  
/**
	 * 获取bean实例
	 * @param beanName 配置文件中bean的Id
	 * @return
	 */
	public Object getBean(String beanName)
	{
		return this.beanObject.get(beanName);
	}

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

 

下面测试MyClassPathXMLApplicationContext类。

Java代码 复制代码
  1. @Test  
  2.     public void testMethod() throws Exception   
  3.     {   
  4.         //读取配置文件   
  5.         MyClassPathXMLApplicationContext ctx=new MyClassPathXMLApplicationContext("applicationContext.xml");   
  6.         //获取UserBean的实例   
  7.         PersonBean bean=(PersonBean)ctx.getBean("userBean");   
  8.         //调用方法   
  9.         bean.show();   
  10.     }  
@Test
	public void testMethod() throws Exception
	{
		//读取配置文件
		MyClassPathXMLApplicationContext ctx=new MyClassPathXMLApplicationContext("applicationContext.xml");
		//获取UserBean的实例
		PersonBean bean=(PersonBean)ctx.getBean("userBean");
		//调用方法
		bean.show();
	}

 

输出结果

结果代码 复制代码
  1. Hello Kuka  
Hello Kuka

 

成功。

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

分享到:
评论

相关推荐

    Spring学习笔记(6)----编码剖析Spring依赖注入的原理

    本篇学习笔记将深入剖析Spring依赖注入的原理,通过源码分析帮助我们理解这一核心机制。 首先,依赖注入允许我们解耦组件之间的关系,使得各个组件可以独立地进行开发、测试和维护。在Spring中,DI主要通过两种方式...

    Spring学习笔记+学习源码.zip

    这份"Spring学习笔记+学习源码.zip"资源包含了深入学习Spring及其相关技术的知识点,以及实践代码,对提升Spring技能将大有裨益。 首先,我们来详细讨论Spring框架的主要组件和功能: 1. **依赖注入(Dependency ...

    SpringDM笔记13-OSGi服务注册与引用

    在SpringDM(Spring Dynamic Modules)框架中,OSGi(Open Service Gateway Initiative)服务注册与引用是核心功能之一,它使得模块化系统中的组件能够互相发现并交互。本篇笔记将探讨如何在OSGi环境中注册服务以及...

    Spring学习笔记(5)----依赖注入的简单实现

    在Spring框架的学习中,依赖注入(Dependency Injection,简称DI)是一个核心概念,它极大地提高了代码的可测试性和可维护性。本篇笔记将探讨Spring如何实现依赖注入,并通过实例进行详细解析。 首先,理解依赖注入...

    spring学习笔记(3.20)

    标题 "spring学习笔记(3.20)" 暗示我们即将探讨的是关于Spring框架的某个特定主题,可能涵盖版本3.20或基于该版本的学习内容。Spring是一个广泛使用的Java企业级应用开发框架,它提供了依赖注入、AOP(面向切面编程...

    Spring学习笔记之一“why spring”

    标题中的"Spring学习笔记之一“why spring”"表明了这篇笔记主要探讨的是Spring框架的核心价值和使用背景。在IT行业中,Spring是一个广泛使用的Java企业级应用开发框架,它以其依赖注入(Dependency Injection,DI)...

    Spring高级源码学习笔记.zip

    源码学习是提升编程技能的重要途径,尤其是在理解复杂框架如Spring的工作原理时。本笔记旨在深入解析Spring的高级源码,帮助程序员从应用层面过渡到源码级的理解。 Spring的核心组件包括Bean容器、AOP代理、数据...

    Spring学习笔记系列之三

    本篇我们将聚焦于"Spring学习笔记系列之三"中的关键知识点——SpringMVC的源码分析,特别是父子容器的启动原理。这个主题是理解Spring MVC工作流程、定制化配置以及优化应用程序性能的关键。 首先,我们要明白...

    Spring 学习笔记六

    在本篇"Spring 学习笔记六"中,我们将深入探讨Spring框架的核心概念和技术细节,同时结合源码分析,以提升对Spring的理解和应用能力。本文档主要关注Spring的依赖注入(Dependency Injection,DI)机制、AOP(面向切...

    Spring整合Mybatis与SpringBoot整合Mybatis原理分析

    **Spring整合Mybatis原理分析** 在Java Web开发中,Spring框架以其强大的依赖注入和面向切面编程能力,成为了事实上的核心框架。Mybatis则是一个轻量级的持久层框架,它简化了数据库操作,提供了直观的SQL映射。将...

    Spring 学习笔记一

    学习 Spring 源码可以帮助开发者更深入地理解其工作原理。例如,了解 BeanFactory 和 ApplicationContext 如何管理 Bean 的生命周期,以及如何实现依赖注入。此外,研究 Spring AOP 的底层实现,如代理模式的应用,...

    Spring学习笔记,参考尚硅谷和黑马课程而作

    Spring学习笔记 Spring是Java EE开发中的一个开源框架,提供了一个轻量级的、灵活的、可扩展的解决方案。Spring框架的核心概念是IoC(Inversion of Control),也就是控制反转,使用对象时,不要主动new产生对象,...

    Spring框架,学习笔记,很优秀的资料

    这份学习笔记将带你深入理解Spring的精髓,包括它的起源、设计理念以及实际应用中的关键功能。 1. **Spring框架简介** Spring最初由Rod Johnson创建,目的是为了解决企业应用开发的复杂性,提供一种轻量级的容器,...

    Spring技术内幕 学习笔记

    7. **Spring学习笔记2——高级特性**: AOP(面向切面编程)、事件发布与监听、自定义拦截器、SpEL(Spring Expression Language)等Spring的高级特性可能会在这部分中被讲解。 8. **Spring学习笔记1——基础知识*...

    spring5框架学习笔记

    Spring 5 框架学习笔记 本笔记主要介绍了 Spring 5 框架的相关知识点,包括 IoC 原理分析、基于 XML 的 IoC 实现、基于 XML 的 DI 使用、基于注解的 IoC 实现、Spring 纯注解实现方式、Spring 整合 Junit、Spring ...

    spring2.0学习笔记+spring定时任务

    在"spring学习总结.doc"这个文档中,可能包含了Spring框架的基本概念,如Bean的声明和管理,以及如何通过XML配置或注解方式实现依赖注入。此外,还可能涵盖了Spring MVC,它是Spring用于构建Web应用的部分,允许...

Global site tag (gtag.js) - Google Analytics