<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sky's blog

    我和我追逐的夢(mèng)

    常用鏈接

    統(tǒng)計(jì)

    其他鏈接

    友情鏈接

    最新評(píng)論

    google guice 綁定常量的另類用法----讀取并注入配置信息

        初學(xué)guice,每每看到guice 綁定常量的用法介紹,總是在想這個(gè)功能有什么用處?實(shí)在想不出來(lái)用它的場(chǎng)合和優(yōu)點(diǎn),感覺(jué)頗為雞肋。
        今天閑坐家中,又無(wú)聊翻書打發(fā)時(shí)間,再次看到這個(gè)東東,作者和我似乎有相同的想法,不過(guò)他的一句“既然我們可以使用自定義注解,那么這里也可以替換成@Named,這里不再贅述。”,讓我突發(fā)奇想,能不能這樣用呢?

        插一句題外話,guice入門資料,這里有一份整理好的,非常適合第一次接觸guice的朋友,推薦給大家:guice入門資料 ,我今天看的就是這個(gè)。

        首先看思路,@Named是這樣用的:
    binder.bindConstant().annotatedWith(named("count")).to(40);
    binder.bindConstant().annotatedWith(named("color")).to("red");
        似乎還沒(méi)有特別感覺(jué)是吧?換成這樣呢?
    binder.bindConstant().annotatedWith(named("username")).to("root");
    binder.bindConstant().annotatedWith(named(
    "password")).to("root");
        看到username,password,總該熟悉了吧?配置啊配置,哪有不用配置文件的程序啊。
        提到配置文件,第一個(gè)想到的,當(dāng)然就是最原始的properties資源文件,相信類似這樣內(nèi)容的文件大家都見的多了:
    username=root
    password
    =root
    ip
    =192.168.0.1
    port
    =80
        聯(lián)系一下@Named,有感覺(jué)了吧?properties資源文件的name、value對(duì),剛好對(duì)應(yīng).annotatedWith(named("color")).to("red");如果能把資源文件讀出來(lái),再按照name、value對(duì)用@Named綁定,不就實(shí)現(xiàn)了將properties資源文件中的配置信息綁定到運(yùn)用程序中了嗎?
        先給出資源文件server.config.properties,內(nèi)容簡(jiǎn)單點(diǎn)意思一下:
    server.ip=192.168.0.1
    server.port
    =90
    server.username
    =root
    server.password
    =root
        然后是java實(shí)現(xiàn)代碼,同樣簡(jiǎn)單意思一下而已:
    package test.hw.basic.demo.bindconstant;

    import static com.google.inject.name.Names.named;

    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Enumeration;
    import java.util.Properties;

    import com.google.inject.Binder;
    import com.google.inject.Guice;
    import com.google.inject.Inject;
    import com.google.inject.Injector;
    import com.google.inject.Module;
    import com.google.inject.name.Named;

    public class ConfigMain {

        
    private static class Client {
            @Inject
            @Named(
    "config.server.ip")
            
    private String IP;
            
            @Inject
            @Named(
    "config.server.port")
            
    private int port;
            
            @Inject
            @Named(
    "config.server.username")
            
    private String username;
            
            @Inject
            @Named(
    "config.server.password")
            
    private String password;

            
    public void work() {
                System.out.println(
    "ip=" + IP);
                System.out.println(
    "port=" + port);
                System.out.println(
    "username=" + username);
                System.out.println(
    "password=" + password);
                
    //
            }
        }

        
    public static void main(String[] args) {
            Injector injector 
    = Guice.createInjector(new Module() {
                @SuppressWarnings(
    "unchecked")
                
    public void configure(Binder binder) {
                    Properties p 
    = new Properties();
                    
    try {
                        p.load(
    new InputStreamReader(this.getClass()
                                .getResourceAsStream(
    "server.config.properties")));
                    } 
    catch (IOException e) {
                        e.printStackTrace();
                        
    assert false;
                    }
                    Enumeration e 
    = p.keys();
                    
    while(e.hasMoreElements()) {
                        String key 
    = (String)e.nextElement();
                        String value 
    = (String)p.get(key);
                        binder.bindConstant().annotatedWith(named(
    "config." + key)).to(value);
                    }
                }
            });
            
            Client client 
    = injector.getInstance(Client.class);
            client.work();
        }
    }

        run一下,可以看到意料中的輸出:
    ip=192.168.0.1
    port
    =90
    username
    =root
    password
    =root
        Ok,確認(rèn)無(wú)誤,我的想法得到了驗(yàn)證,這個(gè)思路是可行的。額外注意的是,port是int類型,guice非常機(jī)敏的完成了類型轉(zhuǎn)換,正確的注入了我們期望的int數(shù)據(jù)。

        上面的做法,適合類似用戶名密碼,ip端口這樣的幾乎是必須修改的配置信息,這些信息絕對(duì)不可能寫死在代碼里面。傳統(tǒng)的資源文件或者xml配置文件是存放它們最好的地方,而如何將這些配置信息傳入到以ioc,di為核心理念的應(yīng)用,以spring為例,比如有一個(gè)client bean要連接外部服務(wù)器需要注入ip,port信息,如果直接在applicationContext.xml文件中配置,毫無(wú)疑問(wèn)不是一個(gè)好辦法:太分散了,修改時(shí)找到要修改的地方可不容易,尤其對(duì)于bean比較多的情況而修改的人可能是客戶,現(xiàn)網(wǎng)施工維護(hù)人員,讓他們修改spring配置文件不現(xiàn)實(shí)。記得spring就有現(xiàn)成的完成讀取配置文件再注入bean的方案,細(xì)節(jié)大家可以google一下,比較簡(jiǎn)單好用。
       
        guice剛開始學(xué)習(xí),似乎沒(méi)有找到類似spring的方法,如果真沒(méi)有官方現(xiàn)成的,那么上面的做法無(wú)疑是一條可行的解決方案。

    posted on 2008-08-22 23:54 sky ao 閱讀(4241) 評(píng)論(3)  編輯  收藏 所屬分類: spring & IOC

    評(píng)論

    # re: google guice 綁定常量的另類用法----讀取并注入配置信息 2014-01-06 15:40 yys

    這就是普通的用法啊,沒(méi)感覺(jué)到什么另類的啊  回復(fù)  更多評(píng)論   

    # re: google guice 綁定常量的另類用法----讀取并注入配置信息 2014-10-09 19:15 scyllor

    Names.bindProperties(binder, properties),呵呵。  回復(fù)  更多評(píng)論   

    # re: google guice 綁定常量的另類用法----讀取并注入配置信息 2016-05-27 21:01 luox

    @scyllor
    哈哈哈  回復(fù)  更多評(píng)論   


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲精品无码国产片| 亚洲AV成人片色在线观看| 亚洲不卡在线观看| 四虎成人精品永久免费AV| 亚洲美女又黄又爽在线观看| 无码精品人妻一区二区三区免费| 在线永久免费观看黄网站| 亚洲av午夜国产精品无码中文字| 成在人线AV无码免费| 亚洲色大成网站WWW国产| 夫妻免费无码V看片| 国产亚洲视频在线观看| 亚洲国产小视频精品久久久三级| 羞羞视频免费网站日本| 在线观看亚洲成人| 无码av免费一区二区三区试看| 久久久久亚洲av无码专区| 日本免费人成在线网站| 亚洲欧洲日韩国产一区二区三区| 女人与禽交视频免费看| 四虎一区二区成人免费影院网址 | 可以免费观看的一级毛片| 无码 免费 国产在线观看91| 中文字幕在亚洲第一在线| 久久国产精品免费观看| 亚洲看片无码在线视频| 免费中文字幕不卡视频| 日韩免费视频一区二区| 亚洲人成网网址在线看| 又粗又硬又大又爽免费视频播放| 国产黄在线播放免费观看| 久久精品国产亚洲av水果派| 成年男女男精品免费视频网站| 男女猛烈xx00免费视频试看| 亚洲成AV人片在线观看ww| 在线看片无码永久免费视频| 美女被羞羞网站免费下载| 亚洲国产精品久久久久婷婷软件| 好先生在线观看免费播放| 久久久WWW免费人成精品| 亚洲中文无码线在线观看|