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

模拟Spring实现

阅读更多

我们知道Spring最主要的就是帮我们管理Service,Dao,还有Action。

今天我们就来模拟一下Spring实现的原理,其实就是解析xml和反射机制。

以用户添加为例,直接上代码:

1.User.java

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

import com.yuwl.model.User;

public interface UserDAO {
	public void save(User user);
}

 3.UserDAOImpl.java

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

public class UserDAOImpl implements UserDAO {

	public void save(User user) {
		//Hibernate or Jdbc add
		System.out.println("user saved!");
	}

}

 4.

package com.yuwl.service;

import com.yuwl.dao.UserDAO;
import com.yuwl.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;
	}
}

 5.仿Spring配置文件beans.xml

<beans>

	<bean id="u" class="com.yuwl.dao.impl.UserDAOImpl" />
	
	<bean id="userService" class="com.yuwl.service.UserService" >
		<property name="userDAO" bean="u"/>
	</bean>
	
</beans>

 6.仿Spring的BeanFactory.java

package com.yuwl.spring;

public interface BeanFactory {
	public Object getBean(String id);
}

 7.仿Spring的ClassPathXmlApplicationContext.java

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() throws Exception {
	    //jdom解析xml
            SAXBuilder sb=new SAXBuilder();
	    Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); 
	    Element root=doc.getRootElement(); 
	    List list=root.getChildren("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 o = Class.forName(clazz).newInstance();
	       beans.put(id, o);
	       
	       for(Element propertyElement : (List<Element>)element.getChildren("property")) {
	    	   String name = propertyElement.getAttributeValue("name"); //userDAO
	    	   String bean = propertyElement.getAttributeValue("bean"); //u
	    	   Object beanObject = beans.get(bean);//UserDAOImpl instance
	    	   
	    	   String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
	    	   System.out.println("method name = " + methodName);
	    	   //反射
	    	   Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
	    	   m.invoke(o, beanObject);
	       }
	       
	    }  
	  
	}

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

}

 8.测试

import org.junit.Test;
import com.yuwl.model.User;
import com.yuwl.spring.BeanFactory;
import com.yuwl.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("yuwl");
		u.setPassword("123456");
		service.add(u);
	}

}

 执行成功:

user saved!

 

接下来,将深入Spring的IOC学习。

 

 

0
2
分享到:
评论
2 楼 longhua2003 2015-04-27  
我帮你加上http://www.cr173.com/soft/86290.html从这里下载jdom,这样更完美
1 楼 longhua2003 2015-04-27  
不错,正是我想做的

相关推荐

    模拟spring实现包扫描器功能

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

    Java模拟spring实现

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

    模拟实现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简单模拟Spring容器

    如果能够访问到这个文件,那么我们可以更深入地了解博主如何实现模拟Spring容器的过程。 总之,这个主题涵盖的内容非常广泛,包括了Spring的核心概念、IoC/DI的原理、容器的模拟实现以及可能涉及的开发工具。深入...

    以注解方式模拟Spring IoC AOP

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

    java模拟spring ioc

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

    自己动手模拟spring

    在模拟Spring的过程中,我们需要理解如何设计接口和实现类,以及如何通过容器来管理这些对象并负责它们之间的依赖关系。DI通常通过构造器注入、设值注入和接口注入等方式实现。 2. **组件扫描(Component Scanning...

    模拟 Spring 的实现

    模拟Spring并不是重新创建一个完整的Spring框架,而是为了学习和理解Spring的工作原理,通过编写简单的代码来实现IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)的核心...

    Java模拟的spring实现

    当我们谈论"Java模拟的spring实现"时,这意味着我们要通过纯Java代码来模拟Spring框架的一些关键特性。这有助于我们深入理解Spring的工作原理,并能在没有Spring环境的情况下进行教学、学习或测试。 首先,让我们来...

    模拟spring

    通过模拟Spring的实现,我们可以更深入地了解Spring框架的运作机制,包括IoC容器的初始化、bean的生命周期管理、AOP的实现原理等。同时,动手实践能帮助我们更好地掌握这些概念,并将其应用于实际项目中。 总的来说...

    模拟Spring架构的简易实现

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

    模拟Spring IoC

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

    基于java简单模拟实现spring_ioc

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

    模拟spring ioc过程

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

    模拟spring和工具jar包

    本资源名为“模拟spring和工具jar包”,其目的是为了帮助我们理解Spring框架的核心概念——依赖注入,并通过一个简化版的实现来学习这一机制。 依赖注入是Spring框架的核心特性之一,它允许我们在不直接创建对象的...

    java 解析xml,模拟spring框架ioc

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

    模拟spring中的ClassPathXmlApplicationContext类的实现

    `ClassPathXmlApplicationContext`的实现涉及到了许多Spring的核心概念,如bean的生命周期管理、依赖注入、资源定位和XML解析。理解这个类的工作原理对于深入学习Spring框架是非常有帮助的。通过阅读和分析Spring的...

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

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

    简单模拟spring cglib代理

    Spring框架是目前Java企业开发中最为流行...总结来说,通过模拟Spring的CGLIB代理,我们可以更深入地理解AOP的实现机制和代理模式的工作原理。这对于加深对Spring框架的理解以及开发高质量的Java应用都是非常有帮助的。

Global site tag (gtag.js) - Google Analytics