J2EE DAO模式解析(二)
上一篇,已经对数据库的基本信息进行了读取,连接代码也已经实现。整个流程为
jsp界面--->servlet--->工厂--->manager接口---->manager实现----->工厂------>dao接口------>dao实现的形式。
在这里,很明显工厂是实现各层之间的桥梁。而工厂是通过读取beans-config.xml文件实现的。我们先看一下beans-config.xml文件的配置信息
<?xml version="1.0" encoding="UTF-8"?> <beans> <service-class> <service id="com.bjpowernode.drp.flowcard.manager.FlowCardManager" class="com.bjpowernode.drp.flowcard.manager.impl.FlowCardManagerImpl"/> //其中id为接口类所在位置,class为具体实现该接口的类所在位置,此处为业务逻辑层的配置 </service-class> <dao-class> <dao id="com.bjpowernode.drp.flowcard.dao.FlowCardDao" class="com.bjpowernode.drp.flowcard.dao.impl.FlowCardDaoImpl"/> //此处为dao层的配置 </dao-class> </beans>
工厂的实现代码为
** * 抽象工厂,主要创建两个系列的产品 * 1. Manager系列 * 2. Dao系列 * */ public class BeanFactory { private static BeanFactory instance=new BeanFactory(); private final String beansConfigFile="beans-config.xml"; private Document doc; //保存Service相关对象 private Map serviceMap=new HashMap(); //保存Dao相关对象 private Map daoMap=new HashMap(); private BeanFactory() { try { doc=new SAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream(beansConfigFile)); }catch(DocumentException e) { e.printStackTrace(); throw new RuntimeException(); } } public static BeanFactory getInstance() { return instance; } /** * 根据产品编号取得Service系列产品 * @param serviceId * @return */ public synchronized Object getServiceObject(Class c) { //如果存在相关对象实例,返回 if(serviceMap.containsKey(c.getName())) { return serviceMap.get(c.getName()); } Element beanElt=(Element)doc.selectSingleNode("//service[@id=\""+c.getName()+"\"]"); String className=beanElt.attributeValue("class"); Object service=null; try { service=Class.forName(className).newInstance(); //将创建好多的对象放到Map中 serviceMap.put(c.getName(), service); }catch(Exception e) { throw new RuntimeException(); } return service; } public synchronized Object getDaoObject(Class c) { //如果存在相关对象实例,返回 if(daoMap.containsKey(c.getName())) { return daoMap.get(c.getName()); } Element beanElt=(Element)doc.selectSingleNode("//dao[@id=\""+c.getName()+"\"]"); String className=beanElt.attributeValue("class"); Object dao=null; try { dao=Class.forName(className).newInstance(); //将创建好多的对象放到Map中 daoMap.put(c.getName(), dao); }catch(Exception e) { throw new RuntimeException(); } return dao; } }
这一篇,就先把工厂给配置好。下一篇,我们把由开始都最后的流程进行实现。