我有一个我不能改变的类:
class SomeBean
{
@Inject private Dep1 dep1;
@Inject private Dep2 dep2;
...
@Inject private DepN depN;
}
我有我的课:
class MyBean
{
@Inject@Named("bean1") private SomeBean bean1;
@Inject@Named("bean2") private SomeBean bean2;
}
如何进行模块配置,使 bean1
和 bean2
由具有不同 dep2 实例的不同实例注入(inject),但所有其他依赖项都相同?
如果我使用的是 spring,我可以在上下文文件中创建一个 bean,例如:
<bean class="MyBean">
<property name="bean1">
<bean class="SomeBean">
<property name="dep2" ref="dep2InstanceA"/>
</bean>
</property>
<property name="bean2">
<bean class="SomeBean">
<property name="dep2" ref="dep2InstanceB"/>
</bean>
</property>
</bean>
所以我明确地覆盖了一个属性,所有其他的都是 Autowiring 的。
最佳答案
您需要使用 PrivateModules了解 How do I build two similar but slightly different trees of objects? .
一些伪代码给大家感受下:
class Bean1Module extends PrivateModule
bind(Dep2.class).to(Dep2A.class)
bind(SomeBean.class)
expose(SomeBean.class).annotatedWith("bean1")
class Bean2Module extends PrivateModule
bind(Dep2.class).to(Dep2B.class)
bind(SomeBean.class)
expose(SomeBean.class).annotatedWith("bean2")
它的代码行数可能比 Spring xml 行多一点,但这是类型安全的,代码完整,无需任何插件即可工作,您甚至可以在模块中放置一些逻辑,等等。;)
关于java - 如何覆盖另一个实例的注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15374050/