天天看點

Google Guice 3.0開發Google Guice 3.0開發

版權聲明:本文為部落客chszs的原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/chszs/article/details/58049192

Google Guice 3.0開發

作者:chszs,未經部落客允許不得轉載。經許可的轉載需注明作者和部落格首頁: http://blog.csdn.net/chszs

Google Guice架構是一個基于Java 6以上的輕量級依賴注入架構,由Google開發。你可能會問,如果我們已經有Spring用于依賴注入,那麼為什麼我們需要Guice?好吧,如果你隻需在應用程式中實作依賴注入,那麼你無需使用Spring容器。Spring不僅僅是一個依賴注入架構,二期大多數Spring應用都使用了XML作為依賴注入的方式。而Guice卻是一個相對更輕量級的架構,它的內建更少,有Java執行個體配置和運作時綁定。通過使用Java綁定,可以獲得編譯時的類型檢查和IDE自動完成功能。

Guice架構的運作速度也很快。預設情況下,Guice為每一個依賴(對應Spring的“prototype”範圍)注入一個新的、單獨的對象執行個體,而Spring則預設提供單态執行個體。Guice架構将依賴注入提升到一個新的水準,充分利用Java類型的所有功能,特别是注釋和泛型,使得建構的DI應用程式更加子產品化,更容易編寫,并且錯誤更少、易于維護。

一、下載下傳Google Guice

Google Guice的Maven依賴如下:

<dependency>
    <groupId>com.google.inject</groupId>
    <artifactId>guice</artifactId>
    <version>3.0</version>
</dependency>
           

也可以從Github下載下傳,見:

https://github.com/google/guice

要運作基于Guice的應用程式,有三個依賴包是必須的:

  • guice-3.0.jar
  • javax.inject.jar
  • aopalliance.jar

二、實戰示例

下面建立一個簡單的Java程式,使用Guice實作依賴注入。

1、服務接口類ArithmeticService.java

public interface ArithmeticService {
    void calculate(int a, int b);
}
           

2、服務接口實作類AdditionService.java

public class AdditionService implements ArithmeticService {
    @Override
    public void calculate(int a, int b) {
        System.out.println("Addition of " + a + " and " + b + " is: " + (a + b));
    }
}
           

3、另一個服務接口實作類SubtractionService.java

public class SubtractionService implements ArithmeticService {
    @Override
    public void calculate(int a, int b) {
        System.out.println("Subtraction of " + a + " and " + b + " is: " + (a - b));
    }
}
           

4、第三個服務接口實作類MultiplicationService.java

public class MultiplicationService implements ArithmeticService {
    @Override
    public void calculate(int a, int b) {
    System.out.println("Multiplication of " + a + " and " + b + " is: " + (a * b));
    }
}
           

5、第四個服務接口實作類DivisionService.java

public class DivisionService implements ArithmeticService {
    @Override
    public void calculate(int a, int b) {
        System.out.println("Divisiton of " + a + " and " + b + " is: " + (a / b));
    }
}
           

6、Consumer Class

import javax.inject.Inject;
    public class MyApplication {
        private ArithmeticService service;

    // constructor based injection
    // @Inject
    // public MyApplication(ArithmeticService service){
            // this.service=service;
    // }

    // setter method injection
    @Inject
    public void setService(ArithmeticService service) {
            this.service = service;
    }

    public void calculate(int a, int b) {
        service.calculate(a, b);
    }
}
           

Guice架構既支援基于構造方法的注入方式,也支援基于setter的注入方式。在上面的例子中,使用了基于setter的注入方式,并注釋了基于構造方法的注入方式。

7、綁定服務實作

Google Guice架構需要知道要使用哪一個服務的實作類,是以必須配置它——通過繼承AbstractModule類,并為configure()方法提供一個實作對象。如下:

import com.google.inject.AbstractModule;

public class GuiceInjector extends AbstractModule {
    @Override
    protected void configure() {
        bind(ArithmeticService.class).to(AdditionService.class);
        // bind(ArithmeticService.class).to(MultiplicationService.class);
        // bind(ArithmeticService.class).to(DivisionService.class);
        // bind(ArithmeticService.class).to(SubtractionService.class);
    }
}
           

注意在上面的配置中,我已經将服務綁定到AdditionService實作類上。我們可以将綁定任一實作類到服務接口。如果将來要使用不同的服務實作,如SubtractionService或MultiplicationService,隻需更改上述檔案中的綁定。而無需修改用戶端應用程式。

8、用戶端應用程式

下面寫一個用戶端示例程式。

import com.google.inject.Guice;
import com.google.inject.Injector;

public class ClientApplication {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new GuiceInjector());
        MyApplication app = injector.getInstance(MyApplication.class);
        app.calculate(1, 2);
    }
}
           

這裡我們使用Guice類的createInjector()方法建立了一個Injector對象,并傳遞了我們自定義的注入器實作類的對象。然後使用注入器對象的getInstance()方法來建立一個服務消費類(MyApplication)的執行個體。在建立MyApplication對象時,Guice架構會自動注入其依賴的服務類實作(這裡為AdditionService)。下面是運作代碼的輸出:

Addition of 1 and 2 is: 3
           

還可以使用Google Guice來建立一個沒有配置注入器的服務類(也即綁定服務類實作),如下:

import com.google.inject.Guice;
import com.google.inject.Injector;

public class ClientApplication {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector();
        AdditionService addService = injector.getInstance(AdditionService.class);
        SubtractionService subService = injector.getInstance(SubtractionService.class);
        MultiplicationService mulService = injector.getInstance(MultiplicationService.class);
        DivisionService divService = injector.getInstance(DivisionService.class);

        addService.calculate(1, 2);
        subService.calculate(10, 5);
        mulService.calculate(5, 2);
        divService.calculate(4, 2);
    }
}
           

如上面的例子所示,沒有使用像GuiceInjector這樣的自定義注入器類。運作上面的代碼,将産生以下輸出:

Addition of 1 and 2 is: 3
Subtraction of 10 and 5 is: 5
Multiplication of 5 and 2 is: 10
Divisiton of 4 and 2 is: 2
           

這就是Java語言的Google Guice架構。