`
chineseoa
  • 浏览: 102915 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

自行编写BeanFactory,感受Spring核心的核心

阅读更多
Spring的核心是IoC容器,IoC的核心是无须程序员自行完成对象的实例化和对象间关系的装配。Spring中通过BeanFactory或其子接口类型ApplicationContext完成该项工作。Spring中有关对象的实例化可以实现:

1. 构造方法实例化;
2. 静态工厂方法实例化;
3. 实例工厂方法实例化;
4. FactoryBean实例化等;

实例化的对象可以放置于各种不同的作用范围:

1. singleton;
2. prototype;
3. request;
4. session;
5. global session以及甚至可以自行定义作用范围;

对象关系装配时可以装配的对象为:

1. 基本类型;
2. String类型;
3. 数组类型;
4. List类型;
5. Map类型;
6. Properties类型;
7. 自行定义的Bean对象等;

装配时可以采用:

1. setter注入;
2. 构造子注入;

我们也可以不看Spring源码,通过自行编写BeanFactory,感受IoC需要对象,召之即来的痛快。在接下来的BeanFactory源码中,只实现了:

1. 通过构造方法完成对象的实例化,而且均是单个实例;
2. 通过setter注入方式注入String和自行定义的Bean对象;

源码如下:

package common;

import java.lang.reflect.Method;
import java.util.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.*;

public class MyBeanFactory {
	private Map<String, Object> map=
		new HashMap<String, Object>();
	
	public MyBeanFactory(String path) {
		DocumentBuilderFactory f=
			DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder builder=
				f.newDocumentBuilder();
			Document document=builder.parse(path);
			
			//实例化对象
			buildBeanObject(document);
			//建立对象间关系
			buildBeanObjectRelation(document);
		}catch(Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * 1. 读取配置文件<bean>标记中class属性值用以
	 * 实例化成对象存入Map作为Value;
	 * 2. 读取配置文件<bean>标记中id属性值存入
	 * Map作为Key;
	 * 
	 * @param document
	 */
	private void buildBeanObject(Document document) 
		throws Exception{
		Element root=document.getDocumentElement();
		NodeList beans=root.getElementsByTagName("bean");
		for(int i=0;i<beans.getLength();i++) {
			Element bean=(Element)beans.item(i);
			String id=bean.getAttribute("id");
			String className=bean.getAttribute("class");
			
			map.put(id, Class.forName(className).newInstance());
		}
	}
	
	private void buildBeanObjectRelation(Document document) 
		throws Exception{
		Element root=document.getDocumentElement();
		NodeList beans=root.getElementsByTagName("bean");
		
		BeanWrapper wrapper=null;
		for(int i=0;i<beans.getLength();i++) {
			Element bean=(Element)beans.item(i);
			String id=bean.getAttribute("id");
			Object o=map.get(id);
			NodeList properties=bean.getElementsByTagName("property");
			for(int j=0;j<properties.getLength();j++) {
				Element property=(Element)properties.item(j);
				String name=property.getAttribute("name");
				String value=property.getAttribute("value");
				wrapper=new BeanWrapper(o);
				if(value==null||value.trim().length()==0) {
					value=property.getAttribute("ref");
					wrapper.setProperty(name, map.get(value));
				} else {
					try {
						wrapper.setProperty(name, Integer.parseInt(value));
					}catch(Exception e) {
						wrapper.setProperty(name, value);
					}					
				}				
			}			
		}		
	}	
	
	public Object getBean(String id) {
		return map.get(id);
	}
}

class BeanWrapper {
	Object o;
	Map<String, Method> map=
		new HashMap<String,Method>();
	
	public BeanWrapper(Object o) {
		this.o=o;
	}

	public void setProperty(String name,Object value) throws Exception{
		String methodName="set"+name.toUpperCase().charAt(0)+name.substring(1);
		array2Map(o.getClass().getMethods());
		Method m=map.get(methodName);
		//Method m=o.getClass().getMethod(methodName, value.getClass());
		m.invoke(o, value);
	}
	
	private void array2Map(Method[] ma) {
		for(int i=0;i<ma.length;i++) {
			map.put(ma[i].getName(),ma[i]);
		}
	}
}

分享到:
评论

相关推荐

    二、Spring源码分析——BeanFactory

    BeanFactory是Spring的核心组件之一,它是容器的基石,负责管理应用中的对象,实现依赖注入。这篇文章将深入探讨BeanFactory的工作原理及其相关知识点。 一、BeanFactory的定义 BeanFactory是一个接口,它定义了...

    Spring中ApplicationContext和beanfactory区别.rar

    然而,BeanFactory缺乏一些高级功能,如国际化支持(i18n)、事件传播、AOP代理以及对Spring的其他核心模块如MessageSource、ApplicationEvent等的集成。因此,对于大型复杂的应用,BeanFactory可能显得不够用。 ...

    简单模拟Spring的beanFactory

    本文将通过模拟Spring的`BeanFactory`来深入理解其工作原理,帮助开发者更好地掌握Spring的核心概念。 `BeanFactory`是Spring框架中最基础的bean管理容器,它是所有更高级别的容器(如`ApplicationContext`)的基类...

    Spring核心jar包

    Spring的Bean容器(ApplicationContext或BeanFactory)负责管理所有Bean的生命周期。它根据配置文件或注解来实例化、配置、装配以及管理Bean。Bean的定义可以通过XML、Java配置类或者基于注解的方式进行。 3. **...

    BeanFactory内部解析:Spring框架的心脏如何运作

    BeanFactory 是 Spring 框架中的一个核心接口,用于管理应用程序中的对象(也称为 bean)。它提供了一种将应用程序组件(如服务、数据源、控制器等)解耦并配置到应用程序中的方式。 总的来说,可以初步理解...

    Spring核心技术文档

    Spring框架是Java开发中的核心组件,它为构建可维护、模块化、松耦合的应用提供了全面的解决方案。Spring的核心技术主要包括依赖注入(Dependency Injection,DI)、面向切面编程(Aspect-Oriented Programming,AOP...

    spring的核心思想

    #### 四、Spring的核心组件——BeanFactory与ApplicationContext 1. **BeanFactory**:它是Spring框架中最基本的容器接口,负责创建和管理Bean实例。BeanFactory通过工厂模式为应用程序提供服务,允许应用程序请求...

    Spring核心学习IOC部分

    在Spring框架中,IOC(Inversion of Control,控制反转)是其核心概念之一,它改变了传统应用程序中的对象创建和管理方式。本学习资料主要聚焦于Spring的IOC容器,特别是从最基本的BeanFactory开始,逐步深入理解...

    BeanFactory的实例化

    在 Spring 框架中,BeanFactory 是一个核心组件,负责管理和实例化 Bean。Spring 3 中提供了三种实例化 BeanFactory 的方法,下面将详细介绍这三种方法。 第一种方法:从文件系统资源实例化 BeanFactory 在 Spring...

    Spring框架核心源代码的分析及其感受-6

    在源代码中,`org.springframework.beans.factory.BeanFactory` 和 `org.springframework.context.ApplicationContext` 是IoC容器的两个主要接口,它们提供了加载配置、获取Bean和处理依赖注入等功能。通过阅读这些...

    Spring 5.2.9的IOC核心jar包

    这个压缩包包含的是Spring框架的IOC(Inversion of Control)核心组件的jar包,是理解和使用Spring进行应用程序开发的基础。 **IOC容器** IOC,或称DI,是Spring的核心特性,它使得开发者可以将对象的创建和管理...

    深入解析Spring核心API: 打造高效Java应用

    本文主要探讨了Spring的核心API,包括BeanFactory、BeanDefinition以及事务管理等关键组件,旨在帮助开发者深入理解Spring的工作机制,从而编写出更高效、更可维护的Java应用。 首先,BeanFactory是Spring框架的...

    达内it培训 java培训电子书 内部资料 系列12 SPRING核心 pdf

    《Spring核心》是Java开发领域中的重要学习资源,尤其对于参加达内IT培训的学员而言,这份内部资料具有极高的价值。Spring框架是Java企业级应用开发的基石,它的核心特性包括依赖注入(Dependency Injection,DI)、...

    简单了解Spring中BeanFactory与FactoryBean的区别

    BeanFactory是Spring IoC容器的核心接口,它定义了getBean()、containsBean()等管理Bean的通用方法。BeanFactory是一个工厂的顶层规范,它提供了Bean的实例化、管理和依赖注入等功能。BeanFactory的实现类有...

    day38 05-Spring的BeanFactory与ApplicationContext区别

    在Spring框架中,BeanFactory和ApplicationContext是两种不同的bean容器,它们各自有其特性和应用场景,理解二者的区别对于深入掌握Spring框架至关重要。 首先,BeanFactory是Spring中最基本的bean容器,它提供了对...

    1000行代码读懂spring核心.pdf

    综上所述,文档内容十分丰富,通过一个详细的实战案例——编写精简版Spring框架,逐步解析了Spring框架核心部分的设计与实现。对每个关键步骤都进行了深入讲解,详细描述了各组件的功能和相互间的关系。阅读和理解这...

    Spring的BeanFactory的接口源码中文解释

    Spring的BeanFactory的接口的中文解释

    spring 框架核心包

    它包含BeanFactory接口,是Spring容器的基础,支持XML、注解等多种方式进行bean的配置。 3. **log4j-1.2.16.jar**:这是一个日志记录库,广泛用于Java应用程序,提供灵活的日志记录控制。Spring框架通常会结合日志...

    1000行代码读懂Spring核心

    《1000行代码读懂Spring核心》这篇文章以作者黄亿华的个人经验,通过学习一个简化的Spring框架的实现——tiny-spring项目,来深入理解Spring核心的概念和技术实现。tiny-spring是一个开源项目,旨在通过逐步构建一个...

    Spring之核心容器bean

    Spring框架是Java开发中的一个核心库,主要用于管理对象(通常称为bean)的生命周期和依赖关系。在本篇文章中,我们将深入探讨Spring的核心容器及其bean的概念,以帮助你更好地理解和使用这个强大的工具。 **Spring...

Global site tag (gtag.js) - Google Analytics