欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java使用dom4j解析xml配置文件實現(xiàn)抽象工廠反射示例

 更新時間:2014年01月03日 11:10:06   作者:  
本文主要介紹了java使用dom4j讀取配置文件實現(xiàn)抽象工廠和反射的示例,在Java中也可以同Donet一樣,將差異配置在配置文件里面。另外,我們采用下面的方式實現(xiàn),將會更加便捷

邏輯描述:

現(xiàn)在我們想在B層和D層加上接口層,并使用工廠。而我們可以將創(chuàng)建B和創(chuàng)建D看作是兩個系列,然后就可以使用抽象工廠進行創(chuàng)建了。

配置文件:beans-config.xml。service-class與dao-class分別對應(yīng)兩個系列的產(chǎn)品。子菜單中id對應(yīng)接口的命名空間,class對應(yīng)實現(xiàn)類的命名空間。

復(fù)制代碼 代碼如下:

[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。通過讀取配置文件,取得相關(guān)對象,并將相關(guān)創(chuàng)建好的對象保存在Map中。

復(fù)制代碼 代碼如下:

[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;  

    /** 
     * 抽象工廠,主要創(chuàng)建兩個系列的產(chǎn)品 
     * 1、Manager系列 
     * 2、Dao系列產(chǎn)品 
     * @author liuzhengquan 
     * 
     */  
    public class BeanFactory {  

        private static BeanFactory instance=new BeanFactory();  

        //系統(tǒng)缺省配置文件名稱  
        private final String beansConfigFile="beans-config.xml";  

        //保存Dao相關(guān)對象  
        private Document doc;  

        /* 
         * key=配置文件中的id值 
         * value=對應(yīng)了該Id的對象 
         */  
        private Map serviceMap = new HashMap();//保存Service相關(guān)對象  
        private Map daoMap = new HashMap();//保存Dao相關(guān)對象  

          
        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;  
        }  

        /** 
         * 根據(jù)產(chǎn)品編號取得Service系列產(chǎn)品 
         * @param serviceId 
         * @return 
         */  
        public synchronized Object getServiceObject(Class c){  
            //如果存在相關(guān)對象實例,返回  
            if(serviceMap.containsKey(c.getName())){  
                return serviceMap.get(c.getName());  
            }  
            Element beanElt=(Element)doc.selectSingleNode("http://service[@id=\""+ c.getName() + "\"]");  
            String className=beanElt.attributeValue("class");  
            Object service=null;  

            try {  
                service=Class.forName(className).newInstance();  

                //將創(chuàng)建好的對象放到Map中  
                serviceMap.put(c.getName(), service);  
            } catch (Exception e) {  
                throw new RuntimeException();  
            }  
            return service;  
        }  

        /** 
         * 根據(jù)產(chǎn)品編號取得Dao系列產(chǎn)品 
         * @param daoId 
         * @return 
         */  
        public synchronized Object getDaoObject(Class c){  
            //如果存在相關(guān)對象實例,返回  
            if(daoMap.containsKey(c.getName())){  
                return daoMap.get(c.getName());  
            }  
            Element beanElt=(Element)doc.selectSingleNode("http://dao[@id=\""+c.getName()+"\"]");  
            String className=beanElt.attributeValue("class");  
            Object dao=null;  

            try {  
                dao=Class.forName(className).newInstance();  

                //將創(chuàng)建好的對象放到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);  
        }  

    }  
   

相關(guān)文章

  • 解決Mybatis的@Param()注解導(dǎo)致分頁失效的問題

    解決Mybatis的@Param()注解導(dǎo)致分頁失效的問題

    這篇文章主要介紹了解決Mybatis的@Param()注解導(dǎo)致分頁失效的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Java詳細(xì)解析下拉菜單和彈出菜單的使用

    Java詳細(xì)解析下拉菜單和彈出菜單的使用

    這篇文章主要介紹了怎么用Java來創(chuàng)建和使用下拉菜單和彈出菜單,下拉菜單和彈出菜單是我們經(jīng)常要用的工具,但是你有想過自己怎么去實現(xiàn)它嗎,感興趣的朋友跟隨文章往下看看吧
    2022-04-04
  • java實現(xiàn)發(fā)送郵件功能

    java實現(xiàn)發(fā)送郵件功能

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)發(fā)送郵件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Spring?Boot?Yaml配置高級用法

    Spring?Boot?Yaml配置高級用法

    這篇文章主要介紹了Spring?Boot?Yaml配置高級用法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 舉例解析Java的設(shè)計模式編程中里氏替換原則的意義

    舉例解析Java的設(shè)計模式編程中里氏替換原則的意義

    這篇文章主要介紹了Java的設(shè)計模式中里氏替換原則的意義,文中舉例來說明里氏替換原則中強調(diào)的繼承特性方面可能帶來的問題,需要的朋友可以參考下
    2016-02-02
  • java向上轉(zhuǎn)型與向下轉(zhuǎn)型詳解

    java向上轉(zhuǎn)型與向下轉(zhuǎn)型詳解

    這篇文章主要為大家詳細(xì)介紹了java向上轉(zhuǎn)型與向下轉(zhuǎn)型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • IntelliJ IDEA 無法正常使用SVN的問題和完美解決辦法

    IntelliJ IDEA 無法正常使用SVN的問題和完美解決辦法

    這篇文章主要介紹了IntelliJ IDEA 無法正常使用SVN的問題和解決辦法,本文給大家分享完美解決方案,通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • maven無法依賴spring-cloud-stater-zipkin的解決方案

    maven無法依賴spring-cloud-stater-zipkin的解決方案

    這篇文章主要介紹了maven無法依賴spring-cloud-stater-zipkin如何解決,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • Java實現(xiàn)橋接方法isBridge()和合成方法isSynthetic()

    Java實現(xiàn)橋接方法isBridge()和合成方法isSynthetic()

    本文主要介紹了Java實現(xiàn)橋接方法isBridge()和合成方法isSynthetic(),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • java項目中classpath指向哪里

    java項目中classpath指向哪里

    這篇文章介紹了java項目中classpath指向哪里及工作原理,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12

最新評論