`

模拟spring - 动手写一个spring IOC

 
阅读更多

一、前言

IOC (Inverse of control) - 控制反转,spring的IOC实现原理为利用Java的反射机制并充当工厂的角色完成对象的装配和注入。

二、实现细节

附上一张类的结构图,该例子需要导入jdom.jar和junit.jar



① 用户Bean

package com.zdp.model;

// 用户类
public class User {
	private String userName;
	private String password;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}
② UserService

package com.zdp.service;

import com.zdp.dao.UserDao;
import com.zdp.model.User;

public class UserService {
	private UserDao userDao;

	public void add(User user) {
		userDao.save(user);
	}

	public UserDao getUserDao() {
		return userDao;
	}

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
}
③ UserDao

package com.zdp.dao;

import com.zdp.model.User;

public class UserDao {
	
	public void save(User user) {
		System.out.println("user saved!");
	}
	
}
④ Bean工厂接口

package com.zdp.spring;

// Bean工厂接口
public interface BeanFactory {
	
	public Object getBean(String id);
	
}
⑤ Bean工厂实现

package com.zdp.spring;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

// Bean工厂实现类
public class ClassPathXmlApplicationContext implements BeanFactory {

	private Map<String, Object> beans = new HashMap<String, Object>();

	public ClassPathXmlApplicationContext() throws Exception {
		SAXBuilder sb = new SAXBuilder();
		Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); // 构造文档对象
		Element root = doc.getRootElement(); // 获取根元素HD
		List list = root.getChildren("bean"); // 取名字为bean的所有元素
		for (int i = 0; i < list.size(); i++) {
			Element element = (Element) list.get(i);
			String id = element.getAttributeValue("id");
			String clazz = element.getAttributeValue("class");
			Object beanObj = Class.forName(clazz).newInstance(); // 反射获取对象
			beans.put(id, beanObj); // 将对象存入Bean工厂

			for (Element propertyElement : (List<Element>) element.getChildren("property")) { 
				String name = propertyElement.getAttributeValue("name"); // name="userDao"
				String bean = propertyElement.getAttributeValue("bean"); // bean="userDao"
				Object injectObject = beans.get(bean); // 从Bean工厂中获取UserDao
				String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); // setUserDao
				Method method = beanObj.getClass().getMethod(methodName, injectObject.getClass());
				method.invoke(beanObj, injectObject); // set注入UserDao对象
			}
		}
	}

	public Object getBean(String id) {
		return beans.get(id);
	}

}

这里为核心代码,当然在实际情况中,这一块要复杂的多, 例如:可以一个bean引用另一个bean,还可以有多个配置文件、通过多种方式载入配置文件等等,不过原理还是采用Java的反射机制。

⑥ 配置文件

<beans>
	<bean id="userDao" class="com.zdp.dao.UserDao" />
	<bean id="userService" class="com.zdp.service.UserService" >
		<property name="userDao" bean="userDao" />
	</bean>
</beans>
⑦ 单元测试

package com.zdp.service;

import org.junit.Test;

import com.zdp.model.User;
import com.zdp.spring.BeanFactory;
import com.zdp.spring.ClassPathXmlApplicationContext;

// 测试代码
public class UserServiceTest {

	@Test
	public void testAdd() throws Exception {
		BeanFactory applicationContext = new ClassPathXmlApplicationContext(); // 获取上下文
		UserService service = (UserService) applicationContext.getBean("userService"); // Spring装配Bean
		User user = new User();
		user.setUserName("zhangsan");
		user.setPassword("123456");
		service.add(user); // 将user保存入库
	}

}

三、小结

上文仅仅是简单地模拟了spring的IOC的实现,虽然只是完成了spring中依赖注入的一小部分,但还是很好地展现了Java反射机制在spring中的应用,对于初学者理解IOC应该会有一点帮助。

源码下载地址:http://download.csdn.net/detail/zdp072/7284983


分享到:
评论

相关推荐

    以注解方式模拟Spring IoC AOP

    模拟Spring的IoC,我们可以创建一个简单的容器类,其中包含一个Map来存储bean。然后使用注解处理器扫描带有特定注解(如`@Component`)的类,并将它们注册到容器中。当需要注入依赖时,容器可以解析注解并自动装配。...

    模拟Spring的IOC

    通过以上步骤,我们可以构建一个简单的IOC容器,模拟Spring的核心功能。这不仅有助于理解Spring的工作原理,也为我们自定义轻量级框架提供了可能。在实际开发中,了解并掌握Spring的IOC机制能够帮助我们更好地设计和...

    Spring-IOC手动模拟实现-利用dom4解析xml文件

    /*模拟spring的实现 * 1.通过构造器获取配置文件 * 2.通过dom4j解析配置文件,得到list集合(存放Bean标签的id和class属性) * 3.通过反射实例化得到对应的实例化对象,放置在map中(map是键值对,可根据id获取值)...

    模拟spring ioc过程

    这个"模拟spring ioc过程"的学习例子是基于Java语言的,旨在帮助理解Spring框架中的这两个核心概念。在Java工程中,我们通常会通过配置文件(如XML或Java配置类)来定义bean的定义和它们之间的依赖关系。在实际运行...

    spring-framework-reference-4.3.19.pdf

    - **Spring框架简介**:Spring是一个开源框架,最初由Rod Johnson创建,旨在简化企业级Java应用的开发。Spring框架提供了一种全面的方式来解决各种各样的问题,从依赖注入到事务管理,再到Web应用开发。 - **快速...

    spring-framework-3.2.0.RELEASE-dependencies框架依赖包

    Spring 框架是Java开发中的一个核心框架,它为构建可维护、模块化和松耦合的应用程序提供了全面的支持。3.2.0.RELEASE 版本是 Spring 框架的一个稳定版本,发布于2013年,包含了众多的改进和新特性。在“spring-...

    模拟实现Spring的IOC

    Spring容器就是一个bean的Map:private Map, Object&gt; beans = new HashMap, Object&gt;(); 2、本工程,模拟实现Spring的IOC,将xml中配置的Bean读入到Spring容器中,并在测试用例中调用Spring容器中的bean。 3、开发...

    官方源码 spring-framework-5.3.2.zip

    Spring Framework是Java开发中不可或缺的一个核心框架,它为构建高质量、可维护、可测试的Java应用程序提供了强大的支持。版本5.3.2作为Spring的重要里程碑,引入了一系列增强和改进,旨在提升性能、稳定性以及...

    spring-text-3.2.8和junit4.10

    JUnit 4.10是JUnit系列的一个版本,它在JUnit 4的基础上进行了一些改进和扩展。这个版本引入了新的注解,如`@Rule`,允许用户自定义测试规则,可以实现诸如测试时间限制、临时文件管理等功能。此外,`@Test(expected...

    spring-framework-4.3.6.RELEASE.rar

    Spring Framework是Java开发中不可或缺的一个核心框架,它为构建高质量、可维护、可测试的应用程序提供了全面的解决方案。4.3.6版本作为Spring的一个稳定版本,引入了多项改进和优化,为开发者带来了更好的体验。...

    java模拟spring ioc

    通过以上步骤,我们可以实现一个简单的Java模拟Spring IOC的系统。这种方式可以帮助开发者更好地理解Spring的工作原理,并在没有Spring框架的环境中实现相同的功能。不过,需要注意的是,Spring框架提供了更高级的...

    Spring-IoC 复习笔记.rar

    **Spring-IoC 复习笔记** Spring 框架是 Java 开发中不可或缺的一部分,其核心特性之一就是依赖注入(Dependency Injection,简称 DI),也称为控制反转(Inversion of Control,简称 IoC)。IoC 是一种设计模式,...

    模拟spring IOC非常好的事例

    下面我们将深入探讨这个"模拟spring IOC非常好的事例"所涵盖的知识点。 首先,我们需要理解什么是IOC。IOC是一种设计模式,它的主要思想是将对象的创建和管理权交给一个外部容器,而不是由对象自身来负责。这样可以...

    反射模拟springIOC.rar

    1. **配置文件解析**:在`springIOC_0602`项目中,我们有一个XML配置文件,它定义了bean的声明和它们的依赖。JDOM库被用来读取这个文件,解析bean的定义,包括bean的类名、属性、依赖等。 2. **Bean的创建**:解析...

    spring-framework-4.0.6.RELEASE

    4.0.6.RELEASE是Spring框架的一个稳定版本,它在4.0系列中提供了一系列增强和改进,旨在提升开发效率和应用程序的性能。本文将深入探讨该版本的核心特性、关键组件以及如何在实际项目中有效利用。 一、核心特性 1. ...

    spring-framework-4.2.2.RELEASE

    Spring Framework 4.2.2.RELEASE 是Spring Framework 家族中的一个版本,它在2015年左右发布。Spring Framework是Java平台上一个开源的、全面的、模块化的、轻量级的和企业级的Java应用开发框架,尤其适用于Java EE...

    模拟Spring IoC

    在这个模拟Spring IoC的项目中,我们可以深入理解以下几个关键知识点: 1. **容器的概念**:Spring IoC容器是管理对象及其依赖关系的核心组件。在这个模拟项目中,会有一个类或接口扮演容器的角色,负责创建对象、...

    spring源码spring-framework-4.3.2.RELEASE

    4.3.2.RELEASE是Spring的一个稳定版本,它包含了许多重要的改进和优化,深入理解其源码对于提升开发技能和优化应用性能具有重要意义。 一、核心模块解析 1. **IoC(Inversion of Control)容器**:Spring的核心...

    动手写框架,模拟简易的SpringIOC.rar

    描述中的链接指向了CSDN博客的一个文章,虽然具体内容无法直接复制到这里,但我们可以根据文章标题推测,该文章详细介绍了如何从零开始构建一个简单的IOC容器,以此来模拟Spring框架的工作原理。通过这种方式,学习...

    spring-framework-3.2.1--3.x

    Spring是一个全面的后端应用程序开发框架,它提倡依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP),旨在简化Java企业级应用的开发。3.x系列是Spring的重要发展阶段,其中...

Global site tag (gtag.js) - Google Analytics