`

模拟Spring的IoC或DI

阅读更多

前提:要想模拟实现Spring的IoC,先要掌握的知识点,XML,jdom解析XML,还要知道反射,理解这些后就可以模拟实现Spring的IoC了。   在我们实际用Spring的时候,Spring容器帮我们管理所有的bean,以及相应的依赖注入,当然这里我们先不提事务,AOP什么的先。

实际开发中一般都是才用分层模式: dao层
package com.lbx.dao;

import com.lbx.model.User;

public interface UserDAO {
	public void save(User user);
}
 dao实现层
package com.lbx.dao.impl;

import com.lbx.dao.UserDAO;
import com.lbx.model.User;

public class UserDAOImpl implements UserDAO {

	public void save(User user) {
		System.out.println("a user saved!!!");
	}

}
 model层
package com.lbx.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;
	}
	
}
 服务层(注意,在服务器我们使用依赖注入的形式比较多,提供相应的set方法,Spring的IoC很好的帮我们降低了代码间的耦合性)
package com.lbx.service;

import com.lbx.dao.UserDAO;
import com.lbx.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;
	}
}
 现在的问题是我们怎么将服务层中要使用的Bean(userDAO)注入进去,Spring提供了BeanFactory帮我们产生bean
package com.lbx.spring;

/**
 * 模拟Spring的实现
 * @author Administrator
 *
 */
public interface BeanFactory {
	public Object getBean(String id);
}
 而现实中的Spring提供了一个类ClassPathXmlApplicationContext实现了BeanFactory接口(该类中用一个Map存放所有的bean,一个id对应一个bean)
package com.lbx.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;

public class ClassPathXmlApplicationContext implements BeanFactory {

	// 一个id对应一个bean
	private Map<String, Object> beans = new HashMap<String, Object>();

	public ClassPathXmlApplicationContext() throws Exception {
		// jdom解析XML
		SAXBuilder builder = new SAXBuilder();
		// 开始解析XML
		Document document = builder.build("beans.xml");
		// 获得根元素
		Element root = document.getRootElement();
		// 获取根元素下的所有子元素
		List lists = root.getChildren();
		// 遍历所有的子元素
		for (int i = 0; i < lists.size(); i++) {
			Element e = (Element) lists.get(i);
			String id = e.getAttributeValue("id");
			// 获得bean里面的class
			String class1 = e.getAttributeValue("class");
			// 利用反射获得对象的实例
			Object obj = Class.forName(class1).newInstance();
			System.out.println(id);
			System.out.println(class1);
			beans.put(id, obj);

			// 要是子元素中还有属性
			for (Element propertyElement : (List<Element>) e
					.getChildren("property")) {
				// 根据属性的name
				String name = propertyElement.getAttributeValue("name");
				// 获得要注入的bean的id
				String bean = propertyElement.getAttributeValue("ref");
				// 获得要注入bean的实例(Map中根据id)
				Object beanObject = beans.get(bean);
				// 生成相应的set方法
				String methodName = "set" + name.substring(0, 1).toUpperCase()
						+ name.substring(1);
				System.out.println("set方法名:  " + methodName);

				Method m = obj.getClass().getMethod(methodName,
						beanObject.getClass().getInterfaces()[0]);
				m.invoke(obj, beanObject);
			}
		}

	}

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

}
 下面就是测试代码
package com.lbx.service;

import org.junit.Test;

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

public class UserServiceTest {

	@Test
	public void testAdd() throws Exception {
		BeanFactory applicationContext = new ClassPathXmlApplicationContext();
		
		UserService service = (UserService)applicationContext.getBean("userService");
		
		User u = new User();
		u.setUsername("lbx");
		u.setPassword("123456");
		service.add(u);
	}

}
 

 

 

分享到:
评论

相关推荐

    模拟Spring的IOC

    **模拟Spring的IOC** 在Java世界中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IOC)能力,成为企业级应用开发的首选框架之一。理解并模拟Spring的IOC...

    java模拟spring ioc

    这篇博客“java模拟spring ioc”很可能是探讨如何在没有Spring框架的情况下,使用纯Java代码来实现类似Spring的IOC功能。以下将详细介绍Spring的IOC和DI概念以及如何模拟这些概念。 **依赖注入(Dependency ...

    模拟spring IOC非常好的事例

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

    模拟spring ioc技术

    这个例子展示了如何模拟Spring的IOC和DI。虽然实际的Spring框架提供了更强大和复杂的功能,如自动扫描、AOP(面向切面编程)、事务管理等,但这个简单的模拟可以帮助我们理解核心理念。通过这个小Demo,你应该能更好...

    模拟Spring IoC

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

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

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

    什么是Ioc和DI

    在实际应用中,DI通常作为IoC容器的一部分来实现,例如Spring框架中的BeanFactory或ApplicationContext,它们都提供了依赖注入的功能,从而帮助开发人员遵循IoC的原则,构建出更加灵活、可维护的软件系统。...

    Spring IOC AOP MVC 简单例子

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

    SpringIoc示例代码

    2. **依赖注入(DI)**:Spring IOC的主要功能之一就是依赖注入。有两种方式实现DI:构造器注入和setter注入。构造器注入是在Bean实例化时通过构造函数传递依赖,而setter注入则是通过调用setter方法设置依赖。在`...

    简单模拟springIoc容器

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

    使用Spring IOC/DI 模拟某超市管理功能

    (3)MarketDao类:模拟数据库访问,包含属性对象 Market m,和方法Product findByid(String id)来实现根据商品编号查找商品,方法List&lt;product&gt; findAll()来实现返回仓库(商品集合),方法void addpro(Product p)...

    模拟springIOC

    在本文中,我们将深入探讨“模拟Spring IOC”的概念,以及如何通过自己实现的简单依赖注入来理解这个核心的Spring框架特性。Spring IOC,即Inversion of Control(控制反转),是软件设计模式的一种,它在Spring框架...

    SpringIOC和AOP实现机制模拟

    Spring框架是Java开发中不可或缺的一部分,它通过提供控制反转(IOC)和面向切面编程(AOP)等核心特性,极大地简化了企业级应用的构建。让我们深入探讨这两个概念及其在Spring中的实现机制。 首先,Spring的控制...

    java 解析xml,模拟spring框架ioc

    本教程将深入探讨如何模拟Spring框架的IOC(Inversion of Control,控制反转)功能,特别关注XML配置文件的解析。 首先,我们需要理解什么是IOC。控制反转是一种设计原则,它将对象的创建和管理从对象本身剥离出来...

    spring ioc di aop详解

    在 Spring 中,IOC(Inversion of Control,控制反转)和 DI(Dependency Injection,依赖注入)是两个核心概念,而 AOP(Aspect Oriented Programming,面向切面编程)则是实现模块化和解耦的重要工具。现在,我们...

    spring IOC实现(墨者革离)

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

    基于java简单模拟实现spring_ioc

    Spring的核心特性之一是依赖注入(Dependency Injection,简称DI),也称为控制反转(Inversion of Control,IoC)。在这个项目中,“基于java简单模拟实现spring_ioc”显然是为了帮助开发者理解Spring的IoC容器是...

    模拟实现spring IOC AOP的例子

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

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

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

    Spring的IOC原理

    **Spring的IOC原理详解** **一、IoC理论背景** 在面向对象的软件设计中,对象间的耦合是不可避免的,它们通过相互合作实现业务逻辑。这种耦合就像机械手表中的齿轮,彼此啮合共同完成任务。随着软件系统规模的扩大...

Global site tag (gtag.js) - Google Analytics