工厂模式
通过beanfactory进行解耦,在不同的数据库访问上会出现不同的daoimpl,我们在service上进行调用的时候,需要进行new,就会导致很大的耦合性,就需要改代码,我们需要的是工厂模式创建出来dao层的实现类来进行调用。这个时候通过修改配置文件就可以了。
思路:把各种实体类配置到application.xml上,然后通过工厂类对这个xml文件进行解析,
然后获取根节点,获取所有的bean节点,然后通过id属性判断和传递过来的name进行匹配,然后获取里面的class属性,然后通过反射去创建这个类的实例,返回创建的这个实例。
工厂类:解析xml,通过反射返回一个实例对象。
package cn.itcast.store.utils;
import cn.itcast.store.dao.UserDao;
import cn.itcast.store.domain.User;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.List;
public class BeanFactory {
//解析XML
public static Object createObject(String name) {
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;
}
public static void main(String[] args) throws SQLException {
UserDao ud=(UserDao)BeanFactory.createObject(“UserDao”);
User user=new User();
user.setUsername(“aaa”);
user.setPassword(“aaa”);
User uu = ud.userLogin(user);
System.out.println(uu);
}
}
Application.xml如果获取application.xml文件的输入流 (application.xml必须位于src下配置bean的配置文件,id为文件中的设置的,class为想要创建具体对象的全路径
<?xml version="1.0" encoding="UTF-8"?>