本文章主要详细讲解Guice依赖注入中的Provider服务注入实现,一般都是用于外部服务的注入,比如实现Redis等。
技术 | 版本 |
---|---|
Java | 1.8+ |
Guice | 4.2.3 |
mvn archetype:generate -DgroupId=io.edurt.lc.guice -DartifactId=guice-binder-provider -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=1.0.0 -DinteractiveMode=false
<?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-provider</artifactId>
<name>Learning Center for Guice Binder(Provider)</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>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
guice
: guice就是我们核心要使用的依赖
如果想要注入一个服务我们可以使用Provider
进行实现。
src/main/java
目录下新建io.edurt.lc.guice.GuiceProviderService类文件,在文件输入以下内容package io.edurt.lc.guice;
public interface GuiceProviderService
{
void println(String input);
}
src/main/java
目录下新建io.edurt.lc.guice.GuiceProviderServiceImpl类文件,在文件输入以下内容package io.edurt.lc.guice.io.edurt.lc.guice;
import io.edurt.lc.guice.GuiceProviderService;
public class GuiceProviderServiceImpl
implements GuiceProviderService
{
@Override
public void println(String input)
{
System.out.println(input);
}
}
src/main/java
目录下新建io.edurt.lc.guice.GuiceProvider类文件用于实现注入,在文件输入以下内容package io.edurt.lc.guice;
import com.google.inject.Provider;
public class GuiceProvider
implements Provider<GuiceProviderService>
{
@Override
public GuiceProviderService get()
{
return new GuiceProviderServiceImpl();
}
}
src/test/java
目录创建io.edurt.lc.guice.TestGuiceProvider类文件进行定义的服务进行测试,添加以下代码package io.edurt.lc.guice;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
public class TestGuiceProvider
{
@Inject
private GuiceProviderService providerService;
public static void main(String[] args)
{
Injector injector = Guice.createInjector(binder -> binder.bind(GuiceProviderService.class).toProvider(GuiceProvider.class));
TestGuiceProvider application = injector.getInstance(TestGuiceProvider.class);
application.providerService.println("Hello Guice Provider");
}
}
我们运行程序输出
Hello Guice Provider
我们注意看binder
的配置中,我们使用的是toProvider
将实现类绑定到了Service
接口中,这样就实现了对Provider的注入。
@ProvidedBy
注解绑定src/main/java
目录下新建io.edurt.lc.guice.GuiceAutoProviderService类文件,在文件输入以下内容package io.edurt.lc.guice;
import com.google.inject.ProvidedBy;
@ProvidedBy(value = GuiceAutoProvider.class)
public interface GuiceAutoProviderService
{
void println(String input);
}
注意我们使用
@ProvidedBy
标志了接口的实现类,这样的话我们就可以实现自动注入。
src/main/java
目录下新建io.edurt.lc.guice.GuiceAutoProviderServiceImpl类文件,在文件输入以下内容package io.edurt.lc.guice;
public class GuiceAutoProviderServiceImpl
implements GuiceAutoProviderService
{
@Override
public void println(String input)
{
System.out.println(input);
}
}
src/main/java
目录下新建io.edurt.lc.guice.GuiceAutoProvider类文件,在文件输入以下内容package io.edurt.lc.guice;
import com.google.inject.Provider;
public class GuiceAutoProvider
implements Provider<GuiceAutoProviderService>
{
@Override
public GuiceAutoProviderService get()
{
return new GuiceAutoProviderServiceImpl();
}
}
src/test/java
目录创建io.edurt.lc.guice.TestGuiceAutoProvider类文件进行定义的服务进行测试,添加以下代码package io.edurt.lc.guice;
import com.google.inject.Guice;
import com.google.inject.Inject;
public class TestGuiceAutoProvider
{
@Inject
private GuiceAutoProviderService autoProviderService;
public static void main(String[] args)
{
TestGuiceAutoProvider application = Guice.createInjector().getInstance(TestGuiceAutoProvider.class);
application.autoProviderService.println("Hello Auto Guice Provider");
}
}
我们运行程序输出
Hello Auto Guice Provider
在代码中我们可以看到我们没有去绑定Module也可以实现注入。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。