`
lgd_java2eye
  • 浏览: 189559 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

模拟Spring的IOC

阅读更多

基于上次简单的模拟spring有重新写了个模拟spring的IOC的程序:

package com.gd.model;
/**
 * 
 * @author sandy
 *
 */
public class User {
	private String username;
	private String password;
	/**
	 * @return the username
	 */
	public String getUsername() {
		return username;
	}
	/**
	 * @param username the username to set
	 */
	public void setUsername(String username) {
		this.username = username;
	}
	/**
	 * @return the password
	 */
	public String getPassword() {
		return password;
	}
	/**
	 * @param password the password to set
	 */
	public void setPassword(String password) {
		this.password = password;
	}

}

 

package com.gd.dao;

import com.gd.model.User;

/**
 * 
 * @author sandy
 *
 */
public interface UserDao {
	void addUser(User user);
}

 

/**
 * 
 */
package com.gd.dao.impl;

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

/**
 * @author sandy
 *
 */
public class UserDaoImpl implements UserDao {
	public void addUser(User user) {
		System.out.println("添加用户名称为:"+user.getUsername()+"的用户成功!");
	}
}

 

package com.gd.service;

import com.gd.model.User;

/**
 * 
 * @author sandy
 *
 */
public interface UserService{
	void addUser(User user);
}

 

/**
 * 
 */
package com.gd.dao.service.impl;

import com.gd.dao.UserDao;
import com.gd.model.User;
import com.gd.service.UserService;

/**
 * @author sandy
 *
 */
public class UserServiceImpl implements UserService {

	UserDao  userDao;
	public void addUser(User user) {
		this.userDao.addUser(user);
	}
	/**
	 * @param userDao the userDao to set
	 */
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
}

 

/**
 * 
 */
package com.gd.spring;

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

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

/**
 * @author sandy
 * 从classpath环境配置读取配置文件 该类实现了Bean工厂接口
 */
public class ClasspathXmlApplicationContext implements BeanFactory {

	//定义一个存放bean信息的容器
	private Map<String, Object> container = new HashMap<String, Object>();

	//把传进来fileName文件用dom4j的方式解析,把解析后的结果放到容器container中
	@SuppressWarnings("unchecked")
	public ClasspathXmlApplicationContext(String fileName)
			throws SecurityException, NoSuchMethodException,
			IllegalArgumentException, InvocationTargetException {
		SAXReader reader = new SAXReader();
		Document document;
		try {
			document = reader.read(this.getClass().getClassLoader()
					.getResourceAsStream(fileName));
			Node root = document.selectSingleNode("/beans");
			List list = root.selectNodes("bean");
			for (Object object : list) {
				Element element = (Element) object;
				String beanId = element.attributeValue("id");
				Object clazz = Class.forName(element.attributeValue("class"))
						.newInstance();
				container.put(beanId, clazz);
				Iterator<Element> iter = element.elementIterator();
				while (iter.hasNext()) {
					Element propertyElement = iter.next();
					//获取property中的name="userDao"的值
					String name = propertyElement.attributeValue("name");
					//获取property中的bean="udao"的值
					String bean = propertyElement.attributeValue("bean");
					//获取bean="udao"的bean对象
					Object beanObject = container.get(bean);
					//拼装setUserDao方法				   
					String methodName = "set"
							+ name.substring(0, 1).toUpperCase()
							+ name.substring(1);
					System.out.println(methodName);
					//通过反射方式获取setUserDao方法
					Method method = clazz.getClass().getMethod(methodName,
							beanObject.getClass().getInterfaces()[0]);
					//调用service的setUserDao方法
					method.invoke(clazz, beanObject);
				}
			}
		} catch (DocumentException e1) {
			e1.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}

	//根据beanId来从容器中获得bean的实例
	public Object getBean(String beanId) {
		return container.get(beanId);
	}
}

 

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="udao" class="com.gd.dao.impl.UserDaoImpl"></bean>
	<bean id="userService" class="com.gd.dao.service.impl.UserServiceImpl">
		<property name="userDao" bean="udao"/>
	</bean>
</beans>

 客户端测试代码:

package com.gd.service;

import java.lang.reflect.InvocationTargetException;

import org.junit.Test;

import com.gd.model.User;
import com.gd.spring.BeanFactory;
import com.gd.spring.ClasspathXmlApplicationContext;

/**
 * 
 * @author sandy
 * 
 */
public class TestUserService {

	@Test
	public void addUser() throws SecurityException, IllegalArgumentException,
			NoSuchMethodException, InvocationTargetException {
		User u = new User();
		u.setUsername("lgd");
		BeanFactory factory = new ClasspathXmlApplicationContext(
				"applicationContext.xml");
		UserService service = (UserService) factory.getBean("userService");
		service.addUser(u);
	}
}

 

 

1
0
分享到:
评论

相关推荐

    以注解方式模拟Spring IoC AOP

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

    模拟spring ioc过程

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

    java模拟spring ioc

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

    模拟spring IOC非常好的事例

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

    模拟Spring IoC

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

    模拟spring ioc技术

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

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

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

    简单模拟springIoc容器

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

    模拟springIOC

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

    反射模拟springIOC.rar

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

    java 解析xml,模拟spring框架ioc

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

    使用Java注解模拟spring ioc容器过程解析

    使用Java注解模拟Spring IOC容器过程解析 Java注解是一种特殊的语法结构,用于提供元数据来描述程序元素,如类、方法、字段等。Spring框架的IOC(Inversion of Control,控制反转)容器是Spring框架的核心组件之一...

    SpringIoc示例代码

    Spring IOC,全称Inversion of Control,即“控制反转”,是Spring框架的核心特性之一。在传统的Java应用程序中,对象的创建和管理通常由开发者自己控制。而在Spring IOC中,这种控制权被反转,对象的创建、初始化、...

    模拟实现Spring的IOC

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

    spring IOC AOP simulation.rar

    总的来说,"spring IOC AOP simulation"这个项目为我们提供了一个动手实践的平台,通过模拟Spring的IoC和AOP,我们可以更直观地理解这两个概念,提高我们的Spring框架应用能力。通过编写和运行代码,我们可以看到...

    SpringIOC和AOP实现机制模拟

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

    Spring IOC AOP MVC 简单例子

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

    spring IOC实现(墨者革离)

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

    模拟Spring的Ioc功能

    本篇文章将详细探讨如何利用jdom2解析XML文档以及通过反射机制来模拟Spring的IoC功能。 首先,理解IoC的基本概念。IoC意味着不再由应用程序直接创建对象,而是由一个容器(如Spring IoC容器)来负责对象的生命周期...

Global site tag (gtag.js) - Google Analytics