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;
}
}