我们当前的开发末实现,service层对DAO层有依赖,例如在UserServcieImp中出现了
private ProductDao dao = new ProductDaoImpl();
假如我们做了一个产品OA,但是我们没有办法确定客户采用什么样的数据库,此时我们需要
需要为当前项目开发不同的数据库的版本,例如为oracle,sqlserver,mysql分别开发不同的DAO的实现,但是在项目具体的运行时,我们由无法确定到底执行那种版本.我们可以通过配置文件来配置dao层的各个具体的实现.
private ProductDao dao = (ProductDao) BeanFactory.createObject("productDao");
BeanFactory:
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 {
}
}
xml:
注意:BeanFactory.class.getClassLoader().getResourceAsStream获取文件输入流,该application.xml必须位于src下
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="productDao" class="cn.heima.store.dao.daoimpl.ProductDaoImpl"></bean>
</beans>