java - 如何覆盖另一个实例的注入(inject)

标签 java inversion-of-control guice

我有一个我不能改变的类:

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;
}

如何进行模块配置,使 bean1bean2 由具有不同 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/

相关文章:

java - 计算机科学 : Java MC

java - 如果配置服务器关闭,Spring Cloud 配置客户端会加载本地属性

asp.net-mvc - 将 Entity Framework 与温莎城堡一起使用

java - 与 Guice 一起 Swing

java - 使用 Guice 将委托(delegate)人注入(inject) RESTEasy 中的资源方法

java - 将 Swing GUI 组件的属性绑定(bind)到自定义类方法(属性)

java - Spring 中任意 Model 对象的数据绑定(bind)

c# - 你如何调和 IDisposable 和 IoC?

c# - 如何避免依赖注入(inject)构造函数的疯狂?

java - 将 Guice 的 AOP 特性应用于非托管对象