Java中dom4j读取配置文件实现抽象工厂+反射

开发 后端
在Donet中实现反射的主要原理是:将差异配置在config配置文件里面,并利用接口,通过在U的bin路径下面找到具体实现的名字来使程序运行。

在Java中也可以同Donet一样,将差异配置在配置文件里面。另外,我们采用下面的方式实现,将会更加便捷。

逻辑描述:

现在我们想在B层和D层加上接口层,并使用工厂。而我们可以将创建B和创建D看作是两个系列,然后就可以使用抽象工厂进行创建了。

配置文件:beans-config.xml。service-class与dao-class分别对应两个系列的产品。子菜单中id对应接口的命名空间,class对应实现类的命名空间。

[html] view plaincopyprint? 
 
    <?xml version="1.0" encoding="UTF-8"?>   
    <beans>   
         <service-class>   
            <service id="com.xxjstgb.drp.basedata.manager.ItemManager" class="com.xxjstgb.drp.basedata.manager.ItemManagerImpl" />   
            <service id="com.xxjstgb.drp.flowcard.manager.FlowCardManager" class="com.xxjstgb.drp.flowcard.manager.impl.FlowCardManagerImpl" />   
         </service-class>   
         <dao-class>   
            <dao id="com.xxjstgb.drp.basedata.dao.ItemDao" class="com.xxjstgb.drp.basedata.dao.ItemDao4OracleImpl" />   
            <dao id="com.xxjstgb.drp.flowcard.dao.FlowCardDao" class="com.xxjstgb.drp.flowcard.dao.impl.FlowCardDaoImpl" />   
         </dao-class>   
    </beans>   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

抽象工厂:BeanFactory。通过读取配置文件,取得相关对象,并将相关创建好的对象保存在Map中。

[java] view plaincopyprint? 
 
    package com.xxjstgb.drp.util;   
       
    import java.util.HashMap;   
    import java.util.Map;   
       
    //dom4j   
    import org.dom4j.Document;   
    import org.dom4j.DocumentException;   
    import org.dom4j.Element;   
    import org.dom4j.io.SAXReader;   
       
    import com.xxjstgb.drp.basedata.dao.ItemDao;   
    import com.xxjstgb.drp.basedata.manager.ItemManager;   
    import com.xxjstgb.drp.flowcard.dao.FlowCardDao;   
    import com.xxjstgb.drp.flowcard.manager.FlowCardManager;   
       
    /**  
     * 抽象工厂,主要创建两个系列的产品  
     * 1、Manager系列  
     * 2、Dao系列产品  
     * @author liuzhengquan  
     *  
     */   
    public class BeanFactory {   
           
        private static BeanFactory instance=new BeanFactory();   
           
        //系统缺省配置文件名称   
        private final String beansConfigFile="beans-config.xml";   
           
        //保存Dao相关对象   
        private Document doc;   
           
        /*  
         * key=配置文件中的id值  
         * value=对应了该Id的对象  
         */   
        private Map serviceMap = new HashMap();//保存Service相关对象   
        private Map daoMap = new HashMap();//保存Dao相关对象   
           
           
        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;   
        }   
           
        /**  
         * 根据产品编号取得Dao系列产品  
         * @param daoId  
         * @return  
         */   
        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;   
        }   
           
           
        /**  
         * 测试  
         * @param args  
         */   
        public static void main(String[] args){   
            ItemManager itemManager=(ItemManager)BeanFactory.getInstance().getServiceObject(ItemManager.class);   
            System.out.println("itemManager"+itemManager);   
               
            ItemDao itemDao=(ItemDao)BeanFactory.getInstance().getDaoObject(ItemDao.class);   
            System.out.println("itemDao:"+itemDao);   
               
            FlowCardManager flowCardManager=(FlowCardManager)BeanFactory.getInstance().getServiceObject(FlowCardManager.class);   
            //FlowCardManager flowCardManager=new FlowCardManagerImpl();   
            System.out.println(flowCardManager);   
               
            FlowCardDao flowCardDao=(FlowCardDao)BeanFactory.getInstance().getDaoObject(FlowCardDao.class);   
            //FlowCardDao flowCardDao=new FlowCardDaoImpl();   
            System.out.println("flowCardDao:"+flowCardDao);   
        }   
           
    }   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.

运行结果:

总结:

通过抽象工厂+反射的实现,调用层就可以只认识接口,而无须与具体实现打交道,实现了解耦合。同时,由于配置文件里面是接口和实现的命名空间,我们就可以用相应接口的.class属性,点出命名空间,将配置文件的id和class都以键值对的形式配置在Map中,实现反射。

原文链接:http://blog.csdn.net/liu765023051/article/details/8986629

责任编辑:陈四芳 来源: csdn博客
相关推荐

2011-04-13 09:30:28

dom4j

2024-07-22 08:16:15

2009-06-23 14:17:00

Dom4j

2009-04-02 17:37:38

dom4jXMLJava

2013-03-04 10:40:34

三层架构架构设计

2009-02-01 14:07:01

J2EEXMLXML配置文件

2012-05-30 10:03:57

dom4jXML乱码

2011-08-29 16:48:50

Lua配置文件C++

2023-08-07 16:14:32

propertiesSpring框架

2024-03-06 13:19:19

工厂模式Python函数

2009-08-13 09:58:55

C#读取配置文件

2009-08-13 09:16:57

C#读取配置文件

2010-08-03 09:20:33

Flex读取XML配置

2011-06-14 16:07:13

Qt QSettings类

2013-07-30 11:30:42

Windows PhoWindows Pho

2013-06-08 13:29:27

Android开发DOM读取XMLXML解析

2014-12-31 14:09:23

xml解析

2019-11-22 10:00:53

ICC配置文件Windows 10

2009-04-24 21:31:54

Vmwareesx虚拟化

2010-01-12 16:53:23

Fedora Core
点赞
收藏

51CTO技术栈公众号