某種程度上也可以算是一個輕量級的 Spring,能夠動態地做實作類別的注入。
關於 Guice 的開發動機,可以參考 GitHub 上說明動機的頁面 [1]。
另外如果想知道關於 Guice 開發團隊自己怎麼看 Guice 和 Spring,可以參考 [2]。
Guice 入門
1、設定 Maven
要在專案中使用 Guice,必須先把相關的套件引入專案。如果有使用 Maven 的話,可以在 pom.xml 加入下述的 XML。<dependency>
    <groupId>com.google.inject</groupId>
    <artifactId>guice</artifactId>
    <version>4.0</version>
</dependency>
PS. 這裡使用的 Guice 是近幾個月剛釋出的 Guice 4.0。
2、建立預期要被自動注入的介面與對應的實作類別
因為 Guice 會執行注入,注入的標的是介面
所以要先建立介面(MyInterface),以及要作為該介面的實作類別(ImplementationA)。
/**
 * Interface which can be injected automatically.
 */
public static interface MyInterface {
    /**
     * Get the class name of the implementation.
     * @return
     */
    public String getClassName();
}
 
/**
 * An implementation for MyInterface.
 */
public static class ImplementationA implements MyInterface {
    @Override
    public String getClassName() {
        return "ImplementationA";
    }
}
這裡假設介面提供的方法是 getClassName() 方法,預期要回覆實作類別的類別名稱
因此 ImplementationA 這個實作類別,在 getClassName() 方法的回覆即為 "ImplementationA" 這個字串。
3、建立 Module 的設定
在 Guice 中,繼承 AbstractModule 的類別可以用來指派要被注入的介面、以及對應的實作類別
這些指派的動作必須寫在 configure() 這個方法裡。
/**
 * Configuring the injection of interfaces.
 */
public static class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(MyInterface.class).to(ImplementationA.class);
    }
}
4、建立執行自動注入的類別
因為 Guice 不會全自動地決定哪些類別要自動進行注入,需要我們事先指定
因此這裡先建立一個叫做 RunningService 的類別,並且在建構子上加上 @inject 的 Annotation
表示這個建構子的引數要被注入。
public class RunningService {
    private MyInterface impl; 
 
    @Inject
    public RunningService (MyInterface myInterface) {
        this.impl = myInterface;
    }
 
    public void print () {
        System.out.println("Implementation of my interface: " + this.impl.getClassName());
    }
}
RunningService 提供 print() 方法,作為範例中 RunningService 真正要執行的邏輯。
print() 方法會印出 RunningService 得到的 MyInterface 介面的實作類別名稱。
5、建立程式進入點
最後是在 main() 進入點指定要透過 Guice 取得 RunningService 的 instance
這樣才能讓 Guice 去做好自動注入的行為。
public static void main(String[] args) {
    // Initiate the injection through Guice.
    Injector injector = Guice.createInjector(new MyModule());
  
    // Use Guice to inject and get the instance.
    RunningService service = injector.getInstance(RunningService.class);
    service.print();
}程式最後執行的結果如下:
Implementation of my interface: ImplementationA
沒有留言:
張貼留言