1

我有一门我无法更改的课程:

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

如何进行模块配置,以便由具有不同 dep2 实例bean1bean2不同实例注入,但所有其他依赖项都相同?

如果我使用的是 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>

这样我就明确地覆盖了一个属性,所有其他属性都是自动装配的。

4

1 回答 1

4

您需要使用PrivateModules阅读有关如何构建两个相似但略有不同的对象树?.

一些伪代码给你一个感觉:

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 行多一点,但这是类型安全的,代码完整,无需任何插件,您甚至可以在模块中放置一些逻辑等;)

于 2013-03-14T15:22:41.190 回答