【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

相关文章
|
2天前
|
前端开发 Java 数据库连接
Spring MVC 扩展和SSM框架整合
通过以上步骤,我们可以将Spring MVC扩展并整合到SSM框架中。这个过程包括配置Spring MVC和Spring的核心配置文件,创建控制器、服务层和MyBatis的Mapper接口及映射文件。在实际开发中,可以根据具体业务需求进行进一步的扩展和优化,以构建更加灵活和高效的企业级应用程序。
16 5
|
8天前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
|
16天前
|
存储 人工智能 开发框架
Spring AI Alibaba 应用框架挑战赛圆满落幕,恭喜获奖选手
第二届开放原子大赛 Spring AI Alibaba 应用框架挑战赛决赛于 2 月 23 日在北京圆满落幕。
|
25天前
|
前端开发 Java 数据库连接
Spring框架初识
Spring 是一个分层的轻量级开源框架,核心功能包括控制反转(IOC)和面向切面编程(AOP)。主要模块有核心容器、Spring 上下文、AOP、DAO、ORM、Web 模块和 MVC 框架。它通过 IOC 将配置与代码分离,简化开发;AOP 提供了声明性事务管理等增强功能。
74 21
Spring框架初识
|
1月前
|
XML Java 开发者
通过springboot框架创建对象(一)
在Spring Boot中,对象创建依赖于Spring框架的核心特性——控制反转(IoC)和依赖注入(DI)。IoC将对象的创建和管理交由Spring应用上下文负责,开发者只需定义依赖关系。DI通过构造函数、setter方法或字段注入实现依赖对象的传递。Spring Boot的自动配置机制基于类路径和配置文件,自动为应用程序配置Spring容器,简化开发过程。Bean的生命周期包括定义扫描、实例化、依赖注入、初始化和销毁回调,均由Spring容器管理。这些特性提高了开发效率并简化了代码维护。
|
2月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
139 29
|
2月前
|
开发框架 运维 监控
Spring Boot中的日志框架选择
在Spring Boot开发中,日志管理至关重要。常见的日志框架有Logback、Log4j2、Java Util Logging和Slf4j。选择合适的日志框架需考虑性能、灵活性、社区支持及集成配置。本文以Logback为例,演示了如何记录不同级别的日志消息,并强调合理配置日志框架对提升系统可靠性和开发效率的重要性。
|
3月前
|
Java 开发者 Spring
理解和解决Spring框架中的事务自调用问题
事务自调用问题是由于 Spring AOP 代理机制引起的,当方法在同一个类内部自调用时,事务注解将失效。通过使用代理对象调用、将事务逻辑分离到不同类中或使用 AspectJ 模式,可以有效解决这一问题。理解和解决这一问题,对于保证 Spring 应用中的事务管理正确性至关重要。掌握这些技巧,可以提高开发效率和代码的健壮性。
178 13
|
3月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
3月前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
92 5