`

模拟spring功能

阅读更多

1、建立User.java,内容如下:

package net.model;
/**
 * @项目名:spring2.5
 * @包名:net.model
 * @文件名:User.java
 * @日期:Jun 22, 2011 4:31:22 PM
 * @备注:
 * @作者:apple
 */
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;
	}

}

 

2、建立UserDao.java,内容如下:

package net.dao;

import net.model.User;

/**
 * @项目名:spring2.5
 * @包名:net.dao
 * @文件名:UserDao.java
 * @日期:Jun 22, 2011 4:12:42 PM
 * @备注:
 * @作者:apple
 */
public interface UserDao {
	public void save(User u);
}	

 

3、建立UserDaoImpl.java,内容如下:

package net.dao.impl;

import net.dao.UserDao;
import net.model.User;

/**
 * @项目名:spring2.5
 * @包名:net.dao.impl
 * @文件名:UserDaoImpl.java
 * @日期:Jun 22, 2011 4:13:45 PM
 * @备注:
 * @作者:apple
 */
public class UserDaoImpl implements UserDao {

	public void save(User u) {
		// TODO Auto-generated method stub
		System.out.println("user save...");	
	}

}

 

4、建立UserService.java,内容如下:

package net.service;

import net.dao.UserDao;
import net.dao.impl.UserDaoImpl;
import net.model.User;

/**
 * @项目名:spring2.5
 * @包名:net.service
 * @文件名:UserService.java
 * @日期:Jun 22, 2011 4:15:47 PM
 * @备注:
 * @作者:apple
 */
public class UserService {
	private UserDao userDao ;
	
	public UserDao getUserDao() {
		return userDao;
	}

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

	public void add(User u){
		userDao.save(u);
	}//这里可以调用任务实现了UserDao接口的save方法了。

}

 

5、建立BeanFactory.java,内容如下:

 

package net.factory;
/**
 * @项目名:spring2.5
 * @包名:net.factory
 * @文件名:BeanFactory.java
 * @日期:Jun 22, 2011 4:37:08 PM
 * @备注:
 * @作者:apple
 */
public interface BeanFactory {
	public Object getBean(String name);
}

 

6、建立ClassPathXmlApplicationContext.java,内容如下:

package net.util;

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

import net.dao.UserDao;
import net.factory.BeanFactory;
import net.model.User;
import net.service.UserService;

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


/**
 * @项目名:spring2.5
 * @包名:net.util
 * @文件名:ClassPathXmlApplicationContext.java
 * @日期:Jun 22, 2011 4:19:35 PM
 * @备注:
 * @作者:apple
 */
public class ClassPathXmlApplicationContext implements BeanFactory{ 

	private Map<String,Object> beans = new HashMap<String, Object>();
    public ClassPathXmlApplicationContext() throws Exception{
    	SAXBuilder sb=new SAXBuilder();//创建一个SAXBuilder对象
    	Document doc=sb.build(ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream("beans.xml")); //构造文档对象
    	Element root=doc.getRootElement(); //获取根元素
    	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");
   	       System.out.println(id + ":" + clazz);
   	       Object o = Class.forName(clazz).newInstance();
   	       beans.put(id, o); 
   	       //* 以下for循环是实现模拟spring自动装配(注入)功能
	       //一开始列出此bean的所有property子元素
	       for (Element propertyElement : (List<Element>)element.getChildren("property")){
	    	   //获取property子元素中 属性为name的值(也就是需要注入的参数名称)
	    	   String name = propertyElement.getAttributeValue("name");
	    	   //获取property子元素中 属性为bean的值 (需要注入参数的类型),此处的bean值是已经在上面初始化好了的bean的ID了。
	    	   String bean = propertyElement.getAttributeValue("bean");
	    	   //因此此处获取指定ID的bean
	    	   Object beanObject = beans.get(bean);
	    	   
	    	   //组成set方法名称:set + 第一个字母大写 + 其它的字母
	    	   String methodName = "set" + name.substring(0,1).toUpperCase() + name.substring(1);
	    	   System.out.println("methodName = " + methodName);
	    	   //获取bean的set方法,参数(方法名,参数:此参数的类型)
	    	   Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
	    	   //使用反映机制,执行method方法,从而实现注入功能
	    	   m.invoke(o, beanObject);
	       }
   	    }   
    }
    public Object getBean(String name){
		return beans.get(name);
	}
    
    public static void main(String[] args){
    	BeanFactory factory=null;
		try {
			factory = new ClassPathXmlApplicationContext();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		UserService service = (UserService)factory.getBean("userService");
		User u = new User();
		service.add(u);	
    }
}

 

7、建立beans.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="u" class="net.dao.impl.UserDaoImpl">
	</bean>
	<bean id="userService" class="net.service.UserService">
		<property name="userDao" bean="u"/>
	</bean>
</beans>

 

本人实际操作,代码都能正确运行,需要 jdom.jar支持,jdom相关知识,请参看我博客文章xml分类里有提到。

分享到:
评论

相关推荐

    以注解方式模拟Spring IoC AOP

    本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 ### 1. 依赖注入(IoC) 依赖注入是Spring框架的核心特性之一,它通过反转对象创建和管理的控制权,使得应用程序组件之间的耦合...

    模拟Spring的IOC

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

    Spring简单模拟Spring容器

    6. 添加获取Bean实例的方法,模拟Spring容器的getBean功能。 在标签中提到了“源码”和“工具”,这意味着博客可能会深入到Spring框架的源码层面,分析其内部实现机制,同时也可能介绍了一些辅助开发的工具,比如...

    Java模拟spring实现

    在本文中,我们将探讨如何通过Java来模拟Spring框架的基本功能。Spring是一个广泛应用的开源框架,它主要为Java应用程序提供依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP...

    java模拟spring ioc

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

    自己动手模拟spring

    【标题】:“自己动手模拟spring” 【描述】:在该主题中,我们将深入理解Spring框架的核心概念,并通过编码实践来模拟其工作原理。参考链接提供了一个CSDN博客文章,作者详细介绍了如何从零开始创建一个简易版的...

    模拟spring

    《模拟Spring:深入理解与实践》 在软件开发领域,Spring框架无疑是最为广泛使用的Java企业级应用框架之一。它以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)...

    java 解析xml,模拟spring框架ioc

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

    模拟spring和工具jar包

    通过模拟Spring的功能,我们可以更深入地理解这个概念。 在这个模拟Spring的项目中,我们可能找到了以下关键组件和概念: 1. **容器**:在Spring中,ApplicationContext是核心容器,负责管理Bean的生命周期和装配...

    模拟spring实现包扫描器功能

    本文将深入探讨如何模拟Spring实现包扫描器功能,以便在不依赖Spring框架的情况下,扫描指定包下的所有类。 首先,我们需要理解Spring是如何进行包扫描的。在Spring中,这个过程由`org.springframework.context....

    使用反射和注解模拟Spring的依赖注入

    这篇博客"使用反射和注解模拟Spring的依赖注入"探讨了如何通过基本的Java特性来实现类似Spring的功能。我们将深入探讨反射和注解这两个关键概念,以及它们如何在模拟依赖注入中发挥作用。 首先,让我们理解反射的...

    Spring的学习笔记

    **模拟Spring功能** 在学习Spring之前,可能需要理解如何手动管理对象的依赖关系。Spring通过IOC(控制反转)和DI(依赖注入)实现了对对象生命周期的管理,从而消除了手动管理的复杂性。 **搭建Spring运行环境** ...

    模拟Spring的Ioc功能

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

    简单模拟Spring的beanFactory

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

    尚学堂_Spring_0100_模拟Spring

    "模拟Spring"可能意味着我们将通过一个简化版或实例化的Spring核心功能来学习其工作原理。这种实践性的方法有助于我们更直观地理解Spring如何管理对象和处理依赖关系。 首先,Spring中的“AbstractOrientedProgram...

    模拟Spring的依赖注入

    本篇文章将深入探讨如何通过Java代码来模拟Spring的依赖注入机制。 **依赖注入的概念** 依赖注入是一种设计模式,它允许对象在运行时获取其依赖项,而不是在构造函数或初始化方法中硬编码这些依赖项。这样做的好处...

    spring框架学习笔记

    3. **模拟Spring功能**: 在学习Spring时,通过模拟其核心功能,如依赖注入,可以帮助理解其工作原理。例如,可以手动创建对象并管理它们的依赖关系,然后对比Spring如何自动进行这些操作,从而深入理解Spring的IoC...

    spring框架案例学习文档笔记.docx

    第三课模拟Spring功能,旨在让学习者熟悉Spring的核心特性。通过编写简单的类和接口,我们可以模拟Spring如何管理对象的生命周期和依赖关系,这有助于理解Spring的工作原理。 第四课详细介绍了如何搭建Spring的运行...

    模拟Spring架构的简易实现

    "模拟Spring架构的简易实现"这个项目可能是为了理解和学习Spring框架的基本原理而创建的,它可能通过简单的代码来模拟Spring的一些核心功能。 首先,我们要理解Spring的核心概念。依赖注入是Spring最基础的设计模式...

    模拟spring aop技术

    **模拟Spring AOP技术** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组件,它提供了一种在不修改源代码的情况下,通过代理模式来实现横切关注点(如日志、事务管理等)的...

Global site tag (gtag.js) - Google Analytics