`
零度弥合
  • 浏览: 20623 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

简单模拟实现spring的ioc

 
阅读更多

30岁终于看过JDOM代码了,挺开心的。

 

感谢北风网的spring视频,这个讲师挺平和的,该讲的知识点都讲到了。

http://wenku.baidu.com/course/study/698fa200a6c30c2259019e96

 

同时觉得这是java反射的最好例子,所以写在这里。

 

spring的所谓的注入依赖,控制反转(ioc)我感觉可以简单的理解为把创建对象这工作,交给spring,程序员在xml文件中或注解中指明信息就可以。

 

IOC有三种实现方式

1.通过set方法注入

2.通过构造函数注入

3.使用注解注入

 

这里简单演示一下同过set方法注入。

 

classPath下有一个bean.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="studentsDao" class="dao.ipml.StudentsDaoImpl"/>
	<bean id="studentsService" class="service.StudentService">
		<property name="studentsDao" bean="studentsDao"/>
	</bean>
</beans>

 

这其中第一个bean,作为属性注入到第二个bean中,不用被名字迷惑,只是简单总结一下而已。

第一个bean的接口:

package dao;

public interface StudentsDao {
	public void saveStudents();
}

 实现类:

package dao.ipml;

import dao.StudentsDao;

public class StudentsDaoImpl implements StudentsDao {

	@Override
	public void saveStudents() {
		System.out.println("保存成功!!!!");
	}

}

 

被注入的类

package service;

import dao.StudentsDao;

public class StudentService {
	private StudentsDao studentsDao;

	public StudentsDao getStudentsDao() {
		return studentsDao;
	}

	public void setStudentsDao(StudentsDao studentsDao) {
		this.studentsDao = studentsDao;
	}

	public void saveStudents() {
		studentsDao.saveStudents();
	}
}

 

下面就是模拟srping依赖注入的类

package mySrping;

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;

public class ClassPathXmlApplicationContext implements BeanFactory {

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

	public ClassPathXmlApplicationContext(String xml) throws Exception {
		SAXBuilder sb = new SAXBuilder();
		// 构造文档对象
		Document doc = sb.build(this.getClass().getClassLoader()
				.getResourceAsStream("beans.xml"));
		// 获取根元素ID
		Element root = doc.getRootElement();
		// 获取此根元素的所有子元素
		List list = (List) root.getChildren("bean");
		for (int i = 0; i < list.size(); i++) {
			Element e = (Element) list.get(i);
			String id = e.getAttributeValue("id");
			String clazz = e.getAttributeValue("class");
			Object o = Class.forName(clazz).newInstance();
			beans.put(id, o);
			for (Element pe : (List<Element>) e.getChildren("property")) {
				String name = pe.getAttributeValue("name");
				String bean = pe.getAttributeValue("bean");
				Object beanObject = beans.get(bean);
				String methodName = "set" + name.substring(0, 1).toUpperCase()
						+ name.substring(1);
				Method method = o.getClass().getMethod(methodName,
						beanObject.getClass().getInterfaces()[0]);
				method.invoke(o, beanObject);
			}
		}
	}

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

}

 

测试类是这样的:

package testService;

import service.StudentService;
import mySrping.BeanFactory;
import mySrping.ClassPathXmlApplicationContext;
import junit.framework.TestCase;

public class TestStudentsService extends TestCase {
	public void testSaveStudents() throws Exception {
		BeanFactory beanFactory = new ClassPathXmlApplicationContext(
				"beans.xml");
		StudentService ss = (StudentService) beanFactory
				.getBean("studentsService");
		ss.saveStudents();
	}
}

 

java反射是什么,我感觉最原始的解释是,java可以在知道类名的情况下通过Class.forName(clazz).newInstance();直接得到实例,然后调用其方法。

反射的关键作用是,它是在运行时装配的,而在类中并没有关联。怎么实现呢?就下面这两行代码。

最难理解的是这两句代码

Method method = o.getClass().getMethod(methodName,beanObject.getClass().getInterfaces()[0]);
method.invoke(o, beanObject);

 

o是一个对象,它通过Class.forName(clazz).newInstance();来的到

.getClass()可以获得实例的类型类

.getMethod()可以获得这个类的方法,两个参数第一个是方法名,第二个事参数类型,这里只有一个参数也就是注入bean的第一个接口

 

第二句就是执行这个方法

第一个参数是哪个对象来执行这个方法

第二个参数是执行这个方法需要的参数

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    模拟实现Spring的IOC

    模拟实现__Spring的Ioc 1、Spring主要两个作用:实例化Bean,动态装配Bean。并将所有的bean放到spring容器中,调用时从容器中取。Spring容器就是一个bean的Map:private Map, Object&gt; beans = new HashMap, Object&gt;...

    模拟Spring的IOC

    要模拟Spring的IOC容器,我们需要实现以下几个核心功能: - **Bean定义(Bean Definition)**:存储对象的创建信息,如类名、属性值、依赖关系等。 - **Bean工厂(Bean Factory)**:负责读取Bean定义,并根据定义...

    以注解方式模拟Spring IoC AOP

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

    基于java简单模拟实现spring_ioc

    在这个项目中,“基于java简单模拟实现spring_ioc”显然是为了帮助开发者理解Spring的IoC容器是如何工作的,以及如何通过Java代码来模拟这个过程。 首先,让我们了解什么是Spring的IoC。IoC是一种设计模式,它将...

    模拟实现spring IOC AOP的例子

    在提供的例子中,你可以看到如何创建一个Bean工厂,模拟Spring的Bean定义和实例化过程。例如,通过XML配置文件或注解来声明Bean及其依赖,并在需要时由容器负责注入。 接下来,我们转向AOP。AOP允许开发者定义“切...

    模拟spring ioc过程

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

    模拟spring IOC非常好的事例

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

    SpringIOC和AOP实现机制模拟

    在Spring中,IOC主要通过以下几种方式实现: 1. **依赖注入(Dependency Injection, DI)**:这是IOC的核心。Spring容器根据配置信息,将对象所需依赖的对象实例注入到该对象中,而不是由对象自行创建。DI可以通过...

    java模拟spring ioc

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

    spring IOC 简易实现

    NULL 博文链接:https://zhengshuo.iteye.com/blog/573192

    反射模拟springIOC.rar

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

    SpringIoc示例代码

    7. ** ApplicationContext**:Spring应用上下文是IOC容器的实现,提供了获取Bean、事件发布等功能。`TestSpringIoc`可能创建ApplicationContext实例,并通过它来获取和操作Bean。 通过`TestSpringIoc`的测试,我们...

    简单模拟springIoc容器

    在`YQIoc`这个压缩包中,可能包含了实现简单模拟Spring IoC容器的代码。通常,这个模拟会包含以下几个部分: 1. **Bean定义**:这是描述对象如何创建和配置的数据结构。在我们的例子中,bean定义可能是以XML形式...

    模拟Spring IoC

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

    模拟Spring的IoC容器实现注解自动装配

    现在,我们将深入探讨如何模拟Spring的IoC容器实现注解自动装配。 首先,我们需要理解IoC容器的基本工作原理。IoC容器是通过扫描应用程序上下文来发现所有需要管理的bean,并根据bean定义来创建和初始化这些bean。...

    java练习之模拟SPRING IOC,我的SUMMER

    这个练习分为三个主要部分,旨在帮助我们掌握XML配置文件的读取,模拟Spring的IoC机制,以及对Struts框架的简单模拟。下面将逐一解析这些知识点。 **1. XML读取** XML(Extensible Markup Language)是一种通用的...

    Spring IOC AOP MVC 简单例子

    例如,`SpringIOC`目录中的配置文件(如`applicationContext.xml`)用于定义bean的定义和它们之间的依赖关系。通过XML或注解方式声明bean,Spring可以自动管理bean的实例化、初始化和销毁,从而简化了代码并提高了可...

    模拟spring ioc技术

    本篇文章将详细解析“模拟Spring IOC技术”的核心概念,并通过一个小Demo帮助你深入理解IOC的工作原理。 首先,我们来解释一下什么是IOC和DI。控制反转(IOC)是编程中的一个设计原则,它改变了对象获取依赖的方式...

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

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

    spring IOC实现(墨者革离)

    在这个名为"spring_IOC实现(墨者革离)"的项目中,我们可以通过模拟城门叩问的编剧场景来理解这一概念。 首先,控制反转的基本思想是将对象的创建和依赖关系的管理从应用程序中分离出来,交给一个外部容器(在...

Global site tag (gtag.js) - Google Analytics