Java 在Guice中将参数传递给构造函数,而不修改接口/Impl类
我想在Guice中使用Impl绑定接口时传递构造函数参数 有两种解决方案,但我没有访问这些接口/Impl的代码。 它们是由其他团队开发的,我已经将它们包括在我的项目中Java 在Guice中将参数传递给构造函数,而不修改接口/Impl类,java,spring,dependency-injection,guice,Java,Spring,Dependency Injection,Guice,我想在Guice中使用Impl绑定接口时传递构造函数参数 有两种解决方案,但我没有访问这些接口/Impl的代码。 它们是由其他团队开发的,我已经将它们包括在我的项目中 @Named/@Assisted-两者都需要更改Impl的源代码(构造函数)以包含这些注释。(我没有访问此代码的权限) ImplementProvider-通过加载所需参数返回该Impl的实例。这起作用了。 但问题是我有200多个这样的现有DI,我必须编写200多个提供者 目前我们正在使用SpringDI,并且正在迁移到Guice
<bean name="clientWrapper" class="com.wrapper.client.ClientWrapper">
<constructor-arg index="0" value="${server.ip}" />
<constructor-arg index="1" value="${server.port}" />
</bean>
如何在不使用提供商的情况下实现这一点?我认为最好的选择是混合使用和 如果对象的依赖项不能单独按类型计算,请使用
@提供的
方法绑定
public class ProvidesModule extends AbstractModule {
@Provides
IClientWrapper clientWrapper(@Named("server.ip") String ip,
@Named("server.port") int port) {
return new ClientWrapper(ip, port);
}
}
在总体代码大小上,这并没有明显超过Spring,并且是类型安全的
当构造函数只有依赖项可以通过类型单独计算时,则使用toConstructor绑定
protected void configure() {
try {
bind(TransactionLog.class).toConstructor(
DatabaseTransactionLog.class.getConstructor(DatabaseConnection.class));
} catch (NoSuchMethodException e) {
addError(e);
}
}
最后一个选择:
我们的遗产:
interface LegacyThing {
}
class LegacyThingImp implements LegacyThing {
public LegacyThingImp(String test) {
System.out.println(test);
}
}
是我的魔法提供者。这将获取一个实现类和依赖项列表(如Key
s),然后通过Magic(或反射)找到正确的构造函数
公共类TestMagic{
公共静态void main(最终字符串…arg){
Guice.createInjector(
新抽象模块(){
@凌驾
受保护的void configure(){
bind(String.class).annotatedWith(Names.named(“testString”)).toInstance(“Guice!”);
bind(LegacyThing.class).toProvider(新的MagicLegacyProvider(legacythingingmp.class,Key.get(String.class,Names.named(“testString”)));
}
}).getInstance(LegacyThing.class);
}
}
我认为您最好的选择是混合使用和
如果对象的依赖项不能单独按类型计算,请使用@提供的
方法绑定
public class ProvidesModule extends AbstractModule {
@Provides
IClientWrapper clientWrapper(@Named("server.ip") String ip,
@Named("server.port") int port) {
return new ClientWrapper(ip, port);
}
}
在总体代码大小上,这并没有明显超过Spring,并且是类型安全的
当构造函数只有依赖项可以通过类型单独计算时,则使用toConstructor绑定
protected void configure() {
try {
bind(TransactionLog.class).toConstructor(
DatabaseTransactionLog.class.getConstructor(DatabaseConnection.class));
} catch (NoSuchMethodException e) {
addError(e);
}
}
最后一个选择:
我们的遗产:
interface LegacyThing {
}
class LegacyThingImp implements LegacyThing {
public LegacyThingImp(String test) {
System.out.println(test);
}
}
是我的魔法提供者。这将获取一个实现类和依赖项列表(如Key
s),然后通过Magic(或反射)找到正确的构造函数
公共类TestMagic{
公共静态void main(最终字符串…arg){
Guice.createInjector(
新抽象模块(){
@凌驾
受保护的void configure(){
bind(String.class).annotatedWith(Names.named(“testString”)).toInstance(“Guice!”);
bind(LegacyThing.class).toProvider(新的MagicLegacyProvider(legacythingingmp.class,Key.get(String.class,Names.named(“testString”)));
}
}).getInstance(LegacyThing.class);
}
}
我也这么想。我想除了供应商,我没有其他选择。完美的解决方案。提供构造函数注入而不创建多个提供程序类的通用方法。但其中的一个问题是,为什么我们还需要实现hasDependencies呢?它在这里意味着什么,因为我们在提供者类中使用泛型。就我个人而言,我不认为魔术比提供者方法好多少。每个提供程序方法只有4行,并且是类型安全的。嗯,我过去没有使用过hasDependencies
。所以在我的产品代码中使用它有点犹豫。我试图为hasDependencies搜索一些参考资料,但没有多大帮助。你能给我一些链接让我看看吗?让我们看看。我也这么想。我想除了供应商,我没有其他选择。完美的解决方案。提供构造函数注入而不创建多个提供程序类的通用方法。但其中的一个问题是,为什么我们还需要实现hasDependencies呢?它在这里意味着什么,因为我们在提供者类中使用泛型。就我个人而言,我不认为魔术比提供者方法好多少。每个提供程序方法只有4行,并且是类型安全的。嗯,我过去没有使用过hasDependencies
。所以在我的产品代码中使用它有点犹豫。我试图为hasDependencies搜索一些参考资料,但没有多大帮助。你能给我提供一些关于它的链接吗?让我们看看。