天天看點

Guice依賴注入(基礎版)

本教程主要詳細講解Guice的一些基本注入方式,通過該簡單教程讓我們可以快速使用Guice進行簡單系統化開發,後續我們會更深入講解更多子產品,如果還不了解Guice大家可以先去網上自行了解一下.

基礎環境

技術 版本
Java 1.8+
Guice 4.2.3

初始化項目

mvn archetype:generate -DgroupId=io.edurt.lc.guice -DartifactId=guice-binder-basic -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=1.0.0 -DinteractiveMode=false
複制代碼      
  • 修改pom.xml增加Guice依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>lc-guice</artifactId>
        <groupId>io.edurt.lc.guice</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>guice-binder-basic</artifactId>
    <name>Learning Center for Guice Binder(Basic)</name>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.google.inject</groupId>
            <artifactId>guice</artifactId>
            <version>4.2.3</version>
        </dependency>
    </dependencies>
</project>
複制代碼      

guice

: guice就是我們核心要使用的依賴

Guice的綁定模型

  • 修改

    pom.xml

    配置檔案,在

    dependencies

    節點中添加以下内容
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
複制代碼      
  • src/main/java

    目錄下建立io.edurt.lc.guice目錄并在該目錄下建立

    GuiceBasicModule

    類檔案,在檔案輸入以下内容
package io.edurt.lc.guice;
import com.google.inject.AbstractModule;
public class GuiceBasicModule
        extends AbstractModule
{
    @Override
    protected void configure()
    {
        System.out.println("Hello, GuiceBasicModule");
    }
}
複制代碼      

Guice中的綁定模型和Spring中的一樣簡單,我們通過綁定可以提供給程式任意注入類.

綁定我們需要的Module隻需要繼承Guice中的

com.google.inject.AbstractModule

即可,在

configure

方法中實作我們需要的綁定資訊.

  • src/test/java

    源代碼目錄下建構io.edurt.lc.guice.TestGuiceBasicModule單元測試類檔案用于我們測試代碼,在檔案輸入以下内容
package io.edurt.lc.guice;
import com.google.inject.AbstractModule;
public class GuiceBasicModule
        extends AbstractModule
{
    @Override
    protected void configure()
    {
        System.out.println("Hello, GuiceBasicModule");
    }
}
複制代碼      

運作單元測試後,控制台會輸出以下資訊:

Hello, GuiceBasicModule
複制代碼      

或者使用maven指令

mvn clean package

,它将輸出類似以下内容

......
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running io.edurt.lc.guice.TestGuiceBasicModule
Hello, GuiceBasicModule
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.094 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
......
複制代碼      

自定義Class

  • src/main/java

    目錄下建立

    io.edurt.lc.guice.GuiceBasicService

    類檔案内容如下
package io.edurt.lc.guice;
public interface GuiceBasicService
{
    void print(String input);
}
複制代碼      

我們定義了一個接口檔案,它建構了一個

print

方法用于資訊輸出.

  • src/main/java

    io.edurt.lc.guice.GuiceBasicServiceImpl

package io.edurt.lc.guice;
public class GuiceBasicServiceImpl
        implements GuiceBasicService
{
    @Override
    public void print(String input)
    {
        System.out.println(String.format("print %s", input));
    }
}
複制代碼      

它實作了

io.edurt.lc.guice.GuiceBasicService

類中的列印資料功能

  • src/main/java

    目錄下

    io.edurt.lc.guice.GuiceBasicModule

    檔案在

    configure()

    方法中添加以下代碼
bind(GuiceBasicService.class).to(GuiceBasicServiceImpl.class);
複制代碼      

這樣我們就很快的綁定了一個服務,類似于Spring中的

@Bean

方式

bind

标志我們需要綁定的類,

to

标志我們綁定的實作類

  • 接下來修改

    src/test/java

    目錄下的

    io.edurt.lc.guice.TestGuiceBasicModule

    類檔案進行定義的服務進行測試,添加以下代碼
@Test
public void test_service()
{
    Injector injector = Guice.createInjector(new GuiceBasicModule());
    GuiceBasicService service = injector.getInstance(GuiceBasicService.class);
    service.print("Hello Guice");
}
複制代碼      
Hello, GuiceBasicModule
print Hello Guice
複制代碼      

使用

@ImplementedBy

注解

@ImplementedBy

很簡單,我們隻需要在

interface

的接口類上添加

@ImplementedBy(GuiceBasicServiceImpl.class)

注解即可,修改後的代碼如下

@ImplementedBy

告知程式我們的接口具體實作類,Guice會幫我們做自動執行個體化

  • GuiceBasicService

package io.edurt.lc.guice;
@ImplementedBy(GuiceBasicServiceImpl.class)
public interface GuiceBasicService
{
    void print(String input);
}
複制代碼      

GuiceBasicServiceImpl

類中的内容不變

  • 删除

    src/test/java

    io.edurt.lc.guice.TestGuiceBasicModule

    類檔案中的

    GuiceBasicService service = injector.getInstance(GuiceBasicService.class);

    代碼段即可.
Hello, GuiceBasicModule
print Hello Guice
複制代碼      

源碼位址

GitHub