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

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

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

    Sky's blog

    我和我追逐的夢

    常用鏈接

    統計

    其他鏈接

    友情鏈接

    最新評論

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

        初學guice,每每看到guice 綁定常量的用法介紹,總是在想這個功能有什么用處?實在想不出來用它的場合和優點,感覺頗為雞肋。
        今天閑坐家中,又無聊翻書打發時間,再次看到這個東東,作者和我似乎有相同的想法,不過他的一句“既然我們可以使用自定義注解,那么這里也可以替換成@Named,這里不再贅述。”,讓我突發奇想,能不能這樣用呢?

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

        首先看思路,@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,總該熟悉了吧?配置啊配置,哪有不用配置文件的程序啊。
        提到配置文件,第一個想到的,當然就是最原始的properties資源文件,相信類似這樣內容的文件大家都見的多了:
    username=root
    password
    =root
    ip
    =192.168.0.1
    port
    =80
        聯系一下@Named,有感覺了吧?properties資源文件的name、value對,剛好對應.annotatedWith(named("color")).to("red");如果能把資源文件讀出來,再按照name、value對用@Named綁定,不就實現了將properties資源文件中的配置信息綁定到運用程序中了嗎?
        先給出資源文件server.config.properties,內容簡單點意思一下:
    server.ip=192.168.0.1
    server.port
    =90
    server.username
    =root
    server.password
    =root
        然后是java實現代碼,同樣簡單意思一下而已:
    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,確認無誤,我的想法得到了驗證,這個思路是可行的。額外注意的是,port是int類型,guice非常機敏的完成了類型轉換,正確的注入了我們期望的int數據。

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

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

    評論

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

    這就是普通的用法啊,沒感覺到什么另類的啊  回復  更多評論   

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

    Names.bindProperties(binder, properties),呵呵。  回復  更多評論   

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

    @scyllor
    哈哈哈  回復  更多評論   

    主站蜘蛛池模板: 中文字幕一区二区三区免费视频| 看免费毛片天天看| 久久久久久AV无码免费网站| 久久久久无码专区亚洲av| 日日躁狠狠躁狠狠爱免费视频| 国产三级免费电影| 免费精品久久久久久中文字幕| 免费jjzz在线播放国产| g0g0人体全免费高清大胆视频| 国产91精品一区二区麻豆亚洲| xvideos永久免费入口| 亚洲中文字幕无码久久综合网| 在线免费观看h片| 久久亚洲私人国产精品| 99久久免费国产香蕉麻豆| 亚洲中文字幕无码中文字| 日本免费v片一二三区| 一区二区三区视频免费观看| 亚洲熟妇无码乱子AV电影| 免费国产污网站在线观看15| 亚洲福利一区二区| 青青青国产免费一夜七次郎| 视频一区在线免费观看| 国产∨亚洲V天堂无码久久久| 91精品免费不卡在线观看| 亚洲性无码AV中文字幕| 亚洲色图综合在线| 6080午夜一级毛片免费看| 亚洲成a人无码亚洲成av无码| 亚洲人成网站观看在线播放| 久久精品成人免费网站| 亚洲乱人伦精品图片| 免费在线观看的黄色网址| 午夜精品一区二区三区免费视频| 亚洲乱码在线卡一卡二卡新区| 亚洲国产成人久久综合区| 18禁成人网站免费观看| 美女的胸又黄又www网站免费| 亚洲精品福利视频| 亚洲国产天堂久久久久久| **一级毛片免费完整视|