Guice依賴注入(基礎版)
阿新 • • 發佈:2021-09-15
本教程主要詳細講解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.guiceGuiceBasicModule
類檔案,在檔案輸入以下內容
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