欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-13 19:11:46
逻辑描述: 现在我们想在b层和d层加上接口层,并使用工厂。而我们可以将创建b和创建d看作是两个系列,然后就可以使用抽象工厂进行创建了。 配置文件:beans-confi...

逻辑描述:

现在我们想在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);  
        }  

    }