Guice依賴注入入門

---title: Guice依賴注入入門date: 2019-12-17 18:55:00tags: 依賴注入 google

cover: https://i.loli.net/2019/12/11/ocgeXKj6OxzAWkM.jpg

Guice依賴注入入門

首先什麼是依賴注入

在Springboot中,用的最多的一個註解就是@Autowire了,我一直知道它是依賴注入,要用哪個類的方法,加上這個註解就可以了,但是依賴注入,總感覺這個說法很專業,很抽象,算了會用就行了。

今天用到了google的Guice依賴注入,因爲它很小,很輕量。我又想起來到底什麼是依賴注入。經過我吧官方的demo實踐了一遍。對依賴注入的理解又深刻了幾分。我的理解就是,如果A類用到了B類的方法,那麼我們稱A類依賴B類,因爲A類不能單獨的運行,必須要有B類做支撐,這叫做A類依賴B類,注入 我理解在A類中實例化出一個B類的對象。所以總的來說,依賴注入就是在一個類裏面注入一個其他類的實例對象。

如果不考慮依賴注入,我們怎麼去實現呢

我們只能在A類中new 出一個B類的實例對象,然後調用該對象的方法。這樣顯得不夠優雅,也不直觀。代碼可讀性也不好。

有了依賴注入

在Spring中,我們直接使用@Autorire 可以達到同樣的效果。

在Vert.x或者其它項目中,我們總不至於爲了使用個依賴注入,引入一個龐大的spring框架吧,Google爲我們提供了一個輕量級的注入框架Guice。和Spring類似。我們只需要使用@Inject註解就可以了。與Springboot不同的是,我們需要加一點配置。

Guice的使用

1 添加依賴

guice的依賴包是必須的,junit是我們測試使用~~~com.google.injectguice4.0junitjunit4.12test~~~

2 目錄結構

如圖中 我們在Application中依賴了log 和UserService,兩個接口。我們注入使用的是@Inject註解。爲了對比,我在test方法也使用了new 一個新對象的方法(和依賴注入效果是一樣的)。LogImpl和UserServiceImpl都很簡單,裏面都只有一個方法,方法類容是打印一句話。

3 配置注入關係

上圖中使用了@Inject註解但是我們還沒有配置注入關係,這樣是有問題的,因爲我們注入的是接口,在調用方法的時候,並不知道去那裏調用具體實現類的方法。所以需要配置一下綁定關係,新創建一個類,繼承自AbstractModule類。~~~public class MyAppModule extends AbstractModule {protected void configure() {bind(Log.class).to(LogImpl.class);bind(UserService.class).to(UserServiceImpl.class);bind(Application.class).to(ApplicationImpl.class);}}~~~我們將接口和實現類進行綁定。

測試驗證

這裏需要注意的是,需要創建一個injector注射器,我們通過這個注射器的getInstance方法,傳入接口名稱,得到,實例,這樣我們就可以使用實例的方法了。

~~~public class Test{

    private  static Injector injector;
    @BeforeClass
    public static void init(){
        injector = Guice.createInjector( new MyAppModule());
    }
    @org.junit.Test
    public void test(){
//        UserService instance = injector.getInstance(UserService.class);
//        instance.sayHello();
        Application instance = injector.getInstance(Application.class);
        instance.test();
    }
}
~~~
當然更簡單的你也可以直接在ApplicationImpl中直接測試。但是同樣,在我們呢需要在一個類加載的
初期,初始化一個注射器injector對象,然後用該注射器拿到我們需要的實例,執行方法即可

~~~public class ApplicationImpl implements Application {

    @Inject
    private UserService userService;
    @Inject
    private Log log;
    private static Injector injector;
    static {
        injector = Guice.createInjector(new MyAppModule());
    }
    public void test() {
        userService.sayHello();
        log.writeLog();
    }
    public static void main(String[] args) {
        Application instance = injector.getInstance(Application.class);
        instance.test();
    }

}~~~

結果如下~~~hello hi--------記錄日誌-------

~~~

很多時候,不是很清楚的時候,對着例子敲一遍代碼。感覺就清晰多了。

本文由博客一文多發平臺 OpenWrite 發佈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章