xml模拟数据库案例(springIOC解耦)

本文介绍了解耦的概念,展示了如何使用Java的properties文件和Spring的IoC容器实现类之间的解耦,包括读取配置文件、使用反射创建对象以及通过DOM4J解析XML配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

properties解耦

开发步骤:

1 新建文件

2 新建IO流读取配置文件

(注意全路径名字里面必须有无参数的构造器)

注意强转,处理异常为运行时异常

 

!!!注意静态块,在类加载的时候执行,

因为刚开始的时候,用的是静态方法,只是加在到了内存中,并没有执行。

(这是原来)

代码如下:

package com.yidongxueyuan.dao;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;


public class UserBeanFactory {

	
	private  static Properties p= new Properties();
	// 出现:  没有实现完全的耦合: 工厂和 dao层建立了关系: 
	// 目的: 完全解耦和: 
	//读取外部的配置文件: 
	static {// 静态块: 类加载的时候,自动完成:  流当中的数据加载的当中
		
	    try {
	    	//类路径下: 使用类的加载器: 
	    	InputStream in = UserBeanFactory.class.getClassLoader().getResourceAsStream("daoImpl.properties");
		    System.out.println(in);
	    	p.load(in);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
	// 配置文件当中实现可配置: 
	public static UserDao newInstance() {
//		return  new UserDaoImpl();
		String path = p.getProperty("UserDaoImpl");
		
		//底层通过反射 获得一个实例对象: 
		try {
			UserDao dao = (UserDao) Class.forName(path).newInstance();
			return dao;
		}  catch (Exception e) {
		    throw new RuntimeException(e);
		}
	}
	


}

springioc解耦:

用的是xml代替上面,原理一样的。

1 新建xml

<?xml version="1.0" encoding="UTF-8"?>

<!--  -->


<beans>
  <bean id="UserDao" class="com.yidongxueyuan.dao.impl.UserDaoImpl"></bean>
 <!--  <bean id="UserService" class="com.yidongxueyuan.service.impl.UserServiceImpl"></bean>
  <bean id="UserService" class="com.yidongxueyuan.service.impl.UserServiceImpl"></bean> -->
</beans>

2 创建servlet读取配置文件

package com.yidongxueyuan.dao.impl;

import java.io.InputStream;
import java.util.List;

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


// 读取外部的xml 配置文件, 实现解耦: 


// 读取配置文件:  
// dom 4j 解析: 
//通过id 获得class 的值:  ----》 使用反射: 获得一个对象: 
public class BeanFactory {
	//解析XML
	public static Object createObject(String name) {// id的值: 
		try {
			//通过传递过来的name获取application.xml中name对应的class值
			
			//获取到Document对象
			SAXReader reader=new SAXReader();
			//如果获取application.xml文件的输入流 (application.xml必须位于src下)
			InputStream is=BeanFactory.class.getClassLoader().getResourceAsStream("application.xml");
			Document doc=reader.read(is);
			
			//通过Document对象获取根节点  beans
			Element rootElement = doc.getRootElement();
			//通过根节点获取到根节点下所有的子节点 bean,返回集合
			List<Element> list = rootElement.elements();
			//遍历集合,判断每个元素上的id的值是否和当前的name一致
			for (Element ele : list) {
				//ele相当于beans节点下的每个bean
				//获取到当前节点的id属性值
				//如果一致,获取到当前元素上class属性值
				String id=ele.attributeValue("id");
				if(id.equals(name)){
					String str=ele.attributeValue("class");
					//通过反射创建对象并且返回
					Class clazz=Class.forName(str);
					//利用class值通过反射创建对象返回
					return  clazz.newInstance();
					
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

 

dao层的实现类:

对student的xml文件进行crud  :

package com.yidongxueyuan.dao.impl;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;

import com.yidongxueyuan.dao.StudentDao;
import com.yidongxueyuan.domain.Student;
import com.yidongxueyuan.util.Dom4JUtil;

public class StudentDaoImpl implements StudentDao {

	private static final  String PATH = "E:/mytest/students.xml";  
	//dao层: 定义具体的增删改查方法: 
	@Override
	public void save(Student stu) {
		
		//获得文档: 
		Document document = Dom4JUtil.getDocument(PATH);
		
		//获得根标记: 
		Element root = document.getRootElement();
		
		//在root下创建一个student: 
		Element studentEle = root.addElement("student");
		
		studentEle.addAttribute("id", stu.getId());
		studentEle.addAttribute("username", stu.getUsername());
		studentEle.addAttribute("password", stu.getPassword());
		
		//回写: 
		Dom4JUtil.write2File(document, PATH);
		
	}
	public Student findByid(String id) {
		
		//获得doucument: 
		
		Document document = Dom4JUtil.getDocument(PATH);
		
		//使用xpath 
		Element ele = (Element)document.selectSingleNode("//student[@id='"+id+"']"); 
		System.out.println(ele);
		//获得属性值: 
		String idValue = ele.attributeValue("id");
		String usernameValue = ele.attributeValue("username");
		String passwordValue = ele.attributeValue("password");
		
		
		//设置到student: 
		Student stu = new Student(); 
		stu.setId(idValue);
		stu.setUsername(usernameValue); 
		stu.setPassword(passwordValue); 
		
		
		
		
		return stu;
	}
	
	@Override
	public String deleteByid(String id) {
		// TODO Auto-generated method stub
        Document document = Dom4JUtil.getDocument(PATH);
		
		//获得根: 
        Element root = document.getRootElement();
        Element ele = (Element)document.selectSingleNode("//student[@id='"+id+"']"); 
		
		root.remove(ele);
		
		
	     
		Dom4JUtil.write2File(document, PATH);
		

		return null;
	}
	@Override
	public String addByid(String id) {
		// TODO Auto-generated method stub
         Document document = Dom4JUtil.getDocument(PATH);
		Element root = document.getRootElement();
	    Element student = root.addElement("student");
         
	    student.addAttribute("name", "张王杰");
	    student.addAttribute("id", "386");

				
		Dom4JUtil.write2File(document, PATH);
		
		

		
		return null;
	}
	@Override
	public String reviseByid(String id) {
		// TODO Auto-generated method stub
		
		Document document = Dom4JUtil.getDocument(PATH);
		Element root = document.getRootElement();
		Element student = (Element)document.selectSingleNode("//student[@id='"+id+"']"); 
         
	    student.addAttribute("name", "韩芳");
	    student.addAttribute("id", "386");
		Dom4JUtil.write2File(document, PATH);
		return null;
	}
	
	
	
	
}	

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方-教育技术博主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值