Guice依賴注入入門


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

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

Guice依賴注入入門

首先什麼是依賴注入

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

今天用到了google的Guice依賴注入,由於它很小,很輕量。我又想起來到底什麼是依賴注入。通過我吧官方的
demo實踐了一遍。對依賴注入的理解又深入了幾分。個人理解就是,若是A類用到了B類的方法,那麼咱們稱A類依賴B類,
由於A類不能單獨的運行,必需要有B類作支撐,這叫作A類依賴B類,注入 我理解在A類中實例化出一個B類的對象。
因此總的來講,依賴注入就是在一個類裏面注入一個其餘類的實例對象。框架

若是不考慮依賴注入,咱們怎麼去實現呢

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

有了依賴注入

在Spring中,咱們直接使用@Autorire 能夠達到一樣的效果。ui

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

Guice的使用

1 添加依賴

guice的依賴包是必須的,junit是咱們測試使用spa

<dependency>
            <groupId>com.google.inject</groupId>
            <artifactId>guice</artifactId>
            <version>4.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
2 目錄結構


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

3 配置注入關係

上圖中使用了@Inject註解可是咱們尚未配置注入關係,這樣是有問題的,由於咱們注入的是接口,在調用方法的時候,並不知道去那裏調用具體實現類的方法。
因此須要配置一下綁定關係,新建立一個類,繼承自AbstractModule類。3d

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 發佈!
相關文章
相關標籤/搜索