<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í)在想不出來用它的場合和優(yōu)點(diǎn),感覺頗為雞肋。
        今天閑坐家中,又無聊翻書打發(fā)時(shí)間,再次看到這個(gè)東東,作者和我似乎有相同的想法,不過他的一句“既然我們可以使用自定義注解,那么這里也可以替換成@Named,這里不再贅述。”,讓我突發(fā)奇想,能不能這樣用呢?

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

        首先看思路,@Named是這樣用的:
    binder.bindConstant().annotatedWith(named("count")).to(40);
    binder.bindConstant().annotatedWith(named("color")).to("red");
        似乎還沒有特別感覺是吧?換成這樣呢?
    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,有感覺了吧?properties資源文件的name、value對(duì),剛好對(duì)應(yīng).annotatedWith(named("color")).to("red");如果能把資源文件讀出來,再按照name、value對(duì)用@Named綁定,不就實(shí)現(xiàn)了將properties資源文件中的配置信息綁定到運(yùn)用程序中了嗎?
        先給出資源文件server.config.properties,內(nèi)容簡單點(diǎn)意思一下:
    server.ip=192.168.0.1
    server.port
    =90
    server.username
    =root
    server.password
    =root
        然后是java實(shí)現(xià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)無誤,我的想法得到了驗(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文件中配置,毫無疑問不是一個(gè)好辦法:太分散了,修改時(shí)找到要修改的地方可不容易,尤其對(duì)于bean比較多的情況而修改的人可能是客戶,現(xiàn)網(wǎng)施工維護(hù)人員,讓他們修改spring配置文件不現(xiàn)實(shí)。記得spring就有現(xiàn)成的完成讀取配置文件再注入bean的方案,細(xì)節(jié)大家可以google一下,比較簡單好用。
       
        guice剛開始學(xué)習(xí),似乎沒有找到類似spring的方法,如果真沒有官方現(xiàn)成的,那么上面的做法無疑是一條可行的解決方案。

    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

    這就是普通的用法啊,沒感覺到什么另類的啊  回復(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)航:
     
    主站蜘蛛池模板: 亚洲成aⅴ人片久青草影院| 色窝窝免费一区二区三区| 免费少妇a级毛片人成网| 亚洲一区二区三区乱码在线欧洲| 日韩人妻无码精品久久免费一 | 久久精品国产亚洲AV香蕉| 久久www免费人成精品香蕉| 亚洲国产一区视频| 日日摸夜夜添夜夜免费视频 | A国产一区二区免费入口| 亚洲自偷自偷偷色无码中文| 高清永久免费观看| 亚洲精品乱码久久久久久| 国产精品免费福利久久| 亚洲天天做日日做天天看| 日本XXX黄区免费看| 亚洲综合av一区二区三区不卡 | 亚洲av无码专区在线观看下载| 成人黄页网站免费观看大全| 国产精品亚洲AV三区| 亚洲一级特黄无码片| 精品亚洲永久免费精品| 久久精品a亚洲国产v高清不卡 | 久久亚洲AV无码精品色午夜麻豆| 在线a免费观看最新网站| 亚洲不卡中文字幕| 亚洲成人国产精品| 一区二区三区在线免费看| 亚洲无码一区二区三区| 亚洲综合最新无码专区| 99在线热视频只有精品免费| 久久精品国产亚洲AV蜜臀色欲| 国产在线观看免费完整版中文版| A级毛片成人网站免费看| 亚洲精品动漫在线| 四虎永久免费地址在线观看| 国产一级淫片a免费播放口| 在线aⅴ亚洲中文字幕| 美腿丝袜亚洲综合| 日韩av无码成人无码免费| sihu国产精品永久免费|