【spring框架】模拟Spring框架(涉及Jdom的使用)

假设我们先写一个模块,这个模块是用户管理。

以后会有很过个Dao存在,取Dao的时候需要改代码,比较不方便,可以将Dao写在XML然后去读取也可以。

以前的解决方式是工厂类,FactoryMethod,但是也会很慢麻烦(每个Dao一个Factory)

我们可以做个很大的工厂,用来获取所有的Dao。其实就是一个大的配置文件。

我们模拟spring的配置文件,我们读取XML。

读取XML的样例和方法(使用的Jdom开源API)
导入jdom的jar包jdom.jar。
测试XML-text.xml:

<?xml version="1.0" encoding="UTF-8"?>
<HD>
  <disk name="C">
    <capacity>8G</capacity>
    <directories>200</directories>
    <files>1580</files>
  </disk>

  <disk name="D">
    <capacity>10G</capacity>
    <directories>500</directories>
    <files>3000</files>
  </disk>
</HD> 

测试类:

package cn.edu.hpu.jdom;

import java.util.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;

public class Sample {
  public static void main(String[] args) throws Exception{
    SAXBuilder sb=new SAXBuilder();
    Document doc=sb.build(Sample.class.getClassLoader().getResourceAsStream("text.xml"));//构建文档对象
    Element root=doc.getRootElement();//获取根元素
    List list=root.getChildren("disk");//获取名字为disk的所有元素
    for(int i=0;i<list.size();i++)
    {
       Element element=(Element)list.get(i);
       String name=element.getAttributeValue("name");
       String capacity=element.getChildText("capacity");//取disk子元素capacity的内容
       String directories=element.getChildText("directories");
       String files=element.getChildText("files");
       System.out.println("磁盘信息:");
       System.out.println("分区盘符:"+name);
       System.out.println("分区容量:"+capacity);
       System.out.println("目录数:"+directories);
       System.out.println("文件数:"+files);
       System.out.println("-----------------------------------");

    }
  }
} 

运行结果:
磁盘信息:
分区盘符:C
分区容量:8G
目录数:200
文件数:1580
-----------------------------------
磁盘信息:
分区盘符:D
分区容量:10G
目录数:500
文件数:3000
-----------------------------------

能够读取XML了,下面我们来模拟spring来读取beans.xml:
User.java:

package cn.edu.hpu.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;
	}
}

User.Dao:

package cn.edu.hpu.dao;

import cn.edu.hpu.model.User;

public interface UserDao {

	public void save(User u);
}

UserDaoImpl.java:
package cn.edu.hpu.dao.Impl;

import cn.edu.hpu.model.User;

public class UserDaoImpl implements UserDao{

	public void save(User u) {
	   System.out.println("add success!!");
	}

}

UserService.java:

package cn.edu.hpu.service;

import cn.edu.hpu.dao.UserDao;
import cn.edu.hpu.dao.Impl.UserDaoImpl;
import cn.edu.hpu.model.User;

public class UserService {

	private UserDao userDao= new UserDaoImpl();

	public UserDao getUserDao() {
		return userDao;
	}

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

	public void add(User u){
		this.userDao.save(u);
	}
}

对于UserService中的:
private UserDao userDao= new UserDaoImpl();你调用的是谁的DaoImpl,add方法里面就调用的谁的save方法。
可以把UserDaoImpl()写在配置文件中,将来从配置文件读出来,灵活性就会好很多,你要改它的实现只要改配置文件就可以了。

我要做的事情就是从配置文件beans.xml读出这部分内容放在UserService中的UserDao后面。

beans.xml:

<beans>
	<bean id="u" class="cn.edu.hpu.dao.Impl.UserDaoImpl" />
        <!--
	<bean id="userService" class="cn.edu.hpu.service.UserService" >
		<property name="userDao" bean="u"/>
	</bean>
        -->
</beans>

先写一个模拟spring加载配置文件返回对应实体类的类:

package cn.edu.hpu.spring;

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{
		SAXBuilder sb=new SAXBuilder();
		Document doc=sb.build(this.getClass().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();//newInstance默认调用无参构造器
			beans.put(id,o);
		}
	}

	public Object getBean(String id) {

		return beans.get(id);
	}

}

其中BeanFactiry接口:

package cn.edu.hpu.spring;

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

测试:

package cn.edu.hpu.service;
import org.junit.Test;

import cn.edu.hpu.dao.UserDao;
import cn.edu.hpu.model.User;
import cn.edu.hpu.spring.BeanFactory;
import cn.edu.hpu.spring.ClassPathXmlApplicationContext;

public class UserServiceTest {

	@Test
	public void testAdd() throws Exception{
		/*
                //这里是传统方式获取UserService
		UserService service=new UserService();
		User u=new User();
		service.add(u);*/
		BeanFactory factory=new ClassPathXmlApplicationContext();

		UserService userService=new UserService();
		UserDao userDao=(UserDao)factory.getBean("u");
		userService.setUserDao(userDao);
		User u=new User();
		userService.add(u);
	}
}

结果:
u:cn.edu.hpu.dao.Impl.UserDaoImpl

add success!!

模拟了一个Spring框架的过程,让大家更加理解Spring框架的运行机制

转载请注明出处:http://blog.csdn.net/acmman

时间: 2024-10-29 13:45:25

【spring框架】模拟Spring框架(涉及Jdom的使用)的相关文章

Struts VS Spring 两种MVC框架比较

比较 基于Web的MVC framework在J2EE的世界内已是空前繁荣.TTS网站上几乎每隔一两个星期就会有新的MVC框架发布.目前比较好的MVC,老牌的有Struts.Webwork.新兴的MVC 框架有Spring MVC.Tapestry.JSF等.这些大多是著名团队的作品,另外还有一些边缘团队的作品,也相当出色,如Dinamica.VRaptor等.这些框架都提供了较好的层次分隔能力.在实现良好的MVC 分隔的基础上,通过提供一些现成的辅助类库,同时也促进了生产效率的提高. 如何选择

对于Struts和Spring两种MVC框架的比较

比较 基于Web的MVC framework在J2EE的世界内已是空前繁荣.TTS网站上几乎每隔一两个星期就会有新的MVC框架发布.目前比较好的MVC,老牌的有Struts.Webwork.新兴的MVC框架有Spring MVC.Tapestry.JSF等.这些大多是著名团队的作品,另外还有一些边缘团队的作品,也相当出色,如Dinamica.VRaptor等.这些框架都提供了较好的层次分隔能力.在实现良好的MVC 分隔的基础上,通过提供一些现成的辅助类库,同时也促进了生产效率的提高. 如何选择一

Spring.net(一)----Spring.NET框架简介及模块说明

Spring Framework天生丽质,因为其先进的架构和对一系列前沿开发思想的集成,使它从一产生就深得开发者欢迎,它将设计模式运用到了炉火纯青的地方,它的幽雅和魅力征服了许多JAVA开发者,使这些开发者成为了它的信徒,得程序员心者得天下,Spring引领了J2EE开发的潮流,同时Spring和各种框架的强强联手也为它的信徒的尽早飞翔插上了翅膀,比如老大哥SSH(配置烦琐的struts和Hibernate.Spring的集成).后起之秀EJSA(身材轻便使用灵活及零配置的EASYJWEB+JP

深入学习微框架:Spring Boot

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以 及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. 多年以来,Spring IO平台饱受非议的一点就是大量的XML配置以及复杂的依赖管理.在去年的SpringOne 2GX会议上,Pivotal的CTO Adrian Co

ssh整合-SSH框架中Spring的依赖注入问题

问题描述 SSH框架中Spring的依赖注入问题 我做了一个struts+hibernate3+spring的整合,我applicationContext .xml文件中已经配置了 <bean id=""loginAction"" class=""com.web.LoginAction""><property name=""userDao"" ref="&qu

spring+springMVC+mybatis的框架项目基础环境搭建

上一个项目在后台用到spring+springMVC+mybatis的框架,先新项目初步需求也已经下来,不出意外的话,应该也是用这个框架组合. 虽然在之前activiti相关的学习中所用到的框架也是这个,但是当时重点在于实现activiti的功能,因此在环境搭建上也只是以能用为前提,与真实项目中所用的还是差了不少. 因此为了给接下来的项目做准备,今天便抽空练习了一下这个框架组合的搭建.虽然之前的框架都不是我来搭,接下来这个可能也不是让我搭,但记录下来说不定以后能用上,也或者对其他人有用. 那么进

spring+springmvc+springdata+jpa框架怎么连接两个不同的数据库

问题描述 spring+springmvc+springdata+jpa框架怎么连接两个不同的数据库 一个是本地mysql数据库,一个是orcale数据库 有没有demo看一下 解决方案 http://blog.csdn.net/jaune161/article/details/44014937 解决方案二: springmvc多数据源的配置和使用,可以参考:http://my.oschina.net/wangjiankui/blog/49107

java-测试Spring整合hibernate/Struts2框架时,配置文件报奇怪的错误,求解

问题描述 测试Spring整合hibernate/Struts2框架时,配置文件报奇怪的错误,求解 为什么会报无法识别property? 解决方案 怎么都是这种问题,property要包含在bean标签内 解决方案二: Struts2+hibernate+spring整合时错误Struts2+hibernate+spring整合时错误 解决方案三: http://iteye.blog.163.com/blog/static/186308096201210265334689/ 解决方案四: pro

框架-Spring mvc和spring的区别

问题描述 Spring mvc和spring的区别 在书里看到的例子,业务层和持久层用的spring框架,而表现层由Spring mvc 实现 spring mvc和spring的区别在哪里?应用的地方不同吗? 这样的话只有表现层用了MVC的设计模式?其它层可以用spring mvc框架吗? spring可以整合其他的框架,意思说三层可以由不同的框架实现? 刚学spring,问题比较多,先谢了 解决方案 三层架构和MVC是有明显区别的,MVC应该是展现模式(三个加起来以后才是三层架构中的UI层)