java使用dom4j解析xml配置文件实现抽象工厂反射示例

 更新时间:2014年01月03日 11:10:06   作者:  
本文主要介绍了java使用dom4j读取配置文件实现抽象工厂和反射的示例,在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>  

抽象工厂: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);  
        }  

    }  
   

相关文章

  • 详解Spring Cloud Finchley版中Consul多实例注册的问题处理

    详解Spring Cloud Finchley版中Consul多实例注册的问题处理

    这篇文章主要介绍了详解Spring Cloud Finchley版中Consul多实例注册的问题处理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Java Character类的详解

    Java Character类的详解

    本篇文章主要详细介绍了JAVA中 Character类 方法等,需要的朋友可以参考下
    2017-04-04
  • SpringBoot RestTemplate请求日志打印方式

    SpringBoot RestTemplate请求日志打印方式

    这篇文章主要介绍了SpringBoot RestTemplate请求日志打印方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java+opencv3.2.0之scharr滤波器

    Java+opencv3.2.0之scharr滤波器

    这篇文章主要为大家详细介绍了Java+opencv3.2.0之scharr滤波器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 显示IntelliJ IDEA工具的Run Dashboard功能图文详解

    显示IntelliJ IDEA工具的Run Dashboard功能图文详解

    这篇文章主要介绍了显示IntelliJ IDEA工具的Run Dashboard功能,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java生成由时间组成的订单号方式

    Java生成由时间组成的订单号方式

    这篇文章主要介绍了Java生成由时间组成的订单号方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java中时间戳的获取和转换的示例分析

    Java中时间戳的获取和转换的示例分析

    这篇文章主要介绍了Java中时间戳的获取和转换的示例分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 全面理解java中的异常处理机制

    全面理解java中的异常处理机制

    下面小编就为大家带来一篇全面理解java中的异常处理机制。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Springboot集成restTemplate过程详解

    Springboot集成restTemplate过程详解

    这篇文章主要介绍了Springboot集成restTemplate过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 在IDEA中配置Maven镜像的最新方法

    在IDEA中配置Maven镜像的最新方法

    这篇文章主要给大家介绍了关于在IDEA中配置Maven镜像的最新方法,Maven是一个流行的Java项目构建工具,它依赖于互联网上的Mave中央仓库来下载和管理项目依赖库,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-11-11

最新评论