gpt4 book ai didi

java - 如何在 Spring XML 配置中收集和注入(inject)给定类型的所有 bean

转载 作者:IT老高 更新时间:2023-10-28 13:47:18 25 4
gpt4 key购买 nike

Spring 框架最突出的特点之一是 Dependency Injection概念。我理解其背后的建议之一是将一般高级机制与低级细节分开(如 Dependency Inversion Principle 所宣布)。

从技术上讲,这归结为让 bean 实现尽可能少地了解作为依赖项注入(inject)的 bean,例如

public class PrintOutBean {
private LogicBean logicBean;
public void action() {
System.out.println(logicBean.humanReadableDetails());
}
//...
}

<bean class="PrintOutBean">
<property name="loginBean" ref="ShoppingCartBean"/>
</bean>

但是,如果我想要一个在多个依赖 bean 上运行的高级机制呢?

  public class MenuManagementBean {
private Collection<Option> options;
public void printOut() {
for (Option option:options) {
// do something for option
}
//...
}
}

我知道一种解决方案是在单例 bean 中使用 @Autowired 注释,即...

  @Autowired
private Collection<Option> options;

但这不违反分离原则吗?为什么我必须在我使用它们的同一个地方指定哪些依赖项(即我的示例中的 MenuManagementBean 类)?有没有办法像这样在 XML 配置中注入(inject) bean 集合(在 MMB 类中没有任何注释)?

<bean class="MenuManagementBean">
<property name="options">
<xxx:autowire by-type="MyOptionImpl"/>
</property>
</bean>

最佳答案

老问题,在 Spring 3.1 中是可能的:

public class PluginPrototypeTest extends ASpringWebTest {
@Autowired
Collection<IDummyRepo> repos;

@Test
public void cacheTest() {
assertNotNull(repos);
assertEquals(2, repos.size());
for(IDummyRepo r: repos){
System.out.println(r.getName());
}
}
}

@Repository
public class DummyRepo implements IDummyRepo {
@Override
public String getName(){
return "DummyRepo";
}
}
@Repository
public class DummyRepo2 implements IDummyRepo {
@Override
public String getName(){
return "DummyRepo2";
}
}

关于java - 如何在 Spring XML 配置中收集和注入(inject)给定类型的所有 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2799316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com