`

编码剖析Spring管理Bean的原理

阅读更多

以下内容来自于传智播客Spring视频,如有雷同,并非巧合。

一。关于bean的命名

bean的命名采用标准的Java命名约定,即小写字母开头,首字母大写间隔 的命名方式。如accountManageraccountService userDaologinController ,等等。

  每个bean都有一个或多个id (或称之为标识符或名称,在术语 上可以理解成一回事)。这些id 在当前IoC容器中必须唯一。如果 一个bean有多个id,那么其他的id在本质上将被认为是别名。当使用基于XML的配置元数据时,将通过id name 属性来指定bean标识符。id 属性具有唯一性, 而且是一个真正的XML ID属性(也就是xml文档本身就有的一个属性,所以xml会对它进行语法较验,),因为XML规范规定了XML ID命名的有效 字符,所以使用id时,id中不能包含一些特殊字符,如:"/",","等等。通常情况下最好为bean指定一个id。但当bean的命名中包含一些特殊字符,id语法检验通不过时;或同一个bean有多个名称时,可以使用name代替id。

二。编码剖析Spring管理Bean的原理

1。传智播客版微型Spring容器,用来编码剖析Spring管理Bean的原理

需加入dom4j jar来解析xml文档,原代码如下:

import java.net.URL;
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");//加入命名空间
	         //因为beans,bean在xml中命名空间http://www.springframework.org/schema/beans下面,
	         //所以创建beans/bean查询路径都在前面加上命名空间ns:前缀。
	         XPath xsub = document.createXPath("//ns:beans/ns:bean");//创建beans/bean查询路径,其中"//"代表xml文件的根目录,ns代表此xml命名空间http://www.springframework.org/schema/beans
	         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类代码如下:

package junit.test;

public class BeanDefinition {
	private String id;
	private String className;
	
	public BeanDefinition(String id, String className) {
		this.id = id;
		this.className = className;
	}
	//setter和getter方法省略
}

 PersonServiceBean代码如下:

public class PersonServiceBean implements PersonService {
	public void save(){
		System.out.println("我是save()方法");
	}
}

 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-2.5.xsd">
          <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"></bean>
</beans>

 测试类如下:

public class SpringTest {
	@Test public void instanceSpring(){
		ItcastClassPathXMLApplicationContext ctx = new ItcastClassPathXMLApplicationContext("beans.xml");
		PersonService personService = (PersonService)ctx.getBean("personService");
		personService.save();
	}
}

 测试类运行结果打印出:我是save()方法。

所有测试源码在附件中有。

分享到:
评论

相关推荐

    Spring2.5视频教程_编码剖析Spring管理Bean的原理

    《Spring2.5视频教程:编码剖析Spring管理Bean的原理》是由知名教育机构黑马程序员的讲师黎活明主讲的一套教程,旨在深入解析Spring框架2.5版本中Bean的管理机制。本教程通过实际编码演示,帮助学习者理解Spring如何...

    搭建与测试Spring的开发环境和编码剖析Spring 管理Bean的原理

    这个是搭建与测试Spring的开发环境和编码剖析Spring 管理Bean的原理的代码,适合刚接触spring的人学习,如何搭建spring开发环境,以及了解spring是如何管理bean的。这个是由传智播客的老师讲的。

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

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

    编码剖析Spring装配基本属性的原理

    比如,`@Component`家族注解标识一个类作为Spring管理的bean,`@Autowired`自动装配依赖,`@Value`注入值,`@PostConstruct`和`@PreDestroy`分别标记初始化和销毁方法。 3. 配置源: Spring的配置源可以是XML文件...

    编码剖析Spring依赖注入的原理

    本文将深入解析Spring中的依赖注入原理,帮助开发者更好地理解和应用这一核心功能。 依赖注入(Dependency Injection,简称DI)是Spring框架的核心之一,它允许组件之间的依赖关系在运行时由外部容器来管理,而不是...

    spring原理技术详细解析 深入剖析

    《Spring技术内幕:深入解析Spring架构与设计原理》是一本深度剖析Spring框架核心机制的书籍。Spring作为Java领域最广泛使用的轻量级框架之一,它的设计理念、核心组件以及工作原理对于任何一位Java开发者来说,都是...

    深入解析SPRING架构与设计原理(第2版) 带标签 高清版,深入剖析spring运行机制

    1. **依赖注入**:Spring的核心特性之一,通过DI,对象之间的依赖关系不再硬编码,而是由容器在运行时动态管理和维护。这提高了代码的可测试性和可维护性。 2. **AOP**:Spring的AOP模块允许开发者定义“切面”,...

    编码剖析@Resource注解的实现原理

    在Spring框架中,`@Resource`注解是一个重要的依赖注入(DI)工具,它用于标记字段、方法或方法参数,以便Spring容器能够自动装配所需的bean。这篇文章将深入探讨`@Resource`注解的工作原理,以及它如何与Spring的IoC...

    Spring技术内幕:深入解析Spring架构与设计原理

    《Spring技术内幕:深入解析Spring架构与设计原理》是一本深度剖析Spring框架核心概念和技术的专著。本书旨在帮助读者理解Spring的内在运作机制,掌握其设计思想,并能灵活运用到实际开发中。通过深入学习,我们可以...

    Spring 技术内幕高清版本

    《Spring技术内幕》是一本深度剖析Spring框架的专业书籍,它为Java程序员、Spring开发者、平台开发人员、系统架构师以及热衷于开源软件源代码研究的程序员提供了宝贵的资源。本书详细讲解了Spring的核心机制和设计...

    spring源码深入解析

    通过对Spring源码的深入学习,开发者不仅可以掌握其工作原理,还能提升设计和编码能力,更好地应对复杂的企业级开发挑战。文档《Spring源码解析-tom.docx》应包含了上述各方面的详细解读,对于希望深入了解Spring的...

    spring-framework-4.1.6.RELEASE

    《深入剖析Spring Framework 4.1.6.RELEASE》 Spring Framework是Java开发中的一个核心框架,它为构建可维护、高性能和灵活的Java应用程序提供了基础。4.1.6.RELEASE版本是Spring的重要里程碑,引入了多项改进和...

    官方原版源码spring-framework-5.1.0.RELEASE.zip

    《深入剖析Spring Framework 5.1.0.RELEASE源码》 Spring Framework是Java开发中的一个核心框架,它为创建可维护、可扩展且松耦合的Java应用程序提供了全面的基础。5.1.0.RELEASE版本是Spring发展的一个重要里程碑...

    Spring5 源码分析2020.zip

    这份《Spring5 源码分析2020》的学习笔记很可能涵盖了上述内容的深入剖析,包括Spring容器的初始化过程、Bean的生命周期管理、AOP的实现机制、IoC的源码解析,以及Spring MVC和WebFlux的工作流程等。通过阅读这份...

    spring-framework-3.2.6源码(.java)

    《深入剖析Spring Framework 3.2.6源码:揭示Java技术之精髓》 Spring Framework作为Java领域最为广泛应用的轻量级框架之一,其3.2.6版本的源码对于开发者来说是一份宝贵的资源。它揭示了Spring如何通过IoC...

    Spring in action 中文版

    《Spring in Action》是一本深度剖析Spring框架的权威著作,中文版的出现使得更多的中国开发者能够轻松理解并掌握Spring的核心概念和技术。这本书详尽地介绍了如何利用Spring进行企业级Java应用开发,涵盖了从基础到...

    Spring开发指南

    《Spring开发指南》是一本深度剖析Spring框架的教程,提供了清晰明了的PDF版本,适合初学者和进阶开发者深入理解并掌握Spring的核心概念和技术。Spring作为Java领域中最流行的轻量级应用程序框架,其强大的功能和...

    Spring in Action

    《Spring in Action》是一本深度剖析Spring框架的权威著作,对于想要深入了解和使用Spring框架的开发者来说,具有极高的参考价值。Spring是Java领域中最受欢迎的开源框架之一,它简化了企业级应用的开发,提供了诸如...

    Spring源代码解析.rar

    这个"Spring源代码解析.rar"文件很可能是对Spring框架核心组件及其工作原理的深入剖析。通过研究Spring的源代码,我们可以更好地理解它的工作机制,从而优化我们的应用设计,提升开发效率。 1. **IoC(Inversion of...

    spring 教程

    依赖注入是Spring的核心特性之一,它允许组件之间的依赖关系在运行时由外部容器管理,而不是通过组件自身硬编码。这样可以降低组件间的耦合度,提高代码的可测试性和可维护性。 3. Spring模块 Spring框架由多个...

Global site tag (gtag.js) - Google Analytics