在spring中自动关联列表,无需配置
如何在没有配置的情况下使用java自动连接列表 假设我有以下课程:在spring中自动关联列表,无需配置,spring,autowired,Spring,Autowired,如何在没有配置的情况下使用java自动连接列表 假设我有以下课程: public abstract class A { public abstract doStuff(); } public class B extends A { @Override public void doStuff() { System.out.println("I'm B"); } } public class C extends A { @Override
public abstract class A {
public abstract doStuff();
}
public class B extends A {
@Override
public void doStuff() {
System.out.println("I'm B");
}
}
public class C extends A {
@Override
public void doStuff() {
System.out.println("I'm C");
}
}
我有课
public class Aggregator {
@Autowired
private List<A> stuffDoers;
private void doAllStuff() {
for(A a:stuffDoers) {
a.doStuff();
}
}
}
公共类聚合器{
@自动连线
私人名单;
私有void doAllStuff(){
对于(A:玩偶者){
a、 doStuff();
}
}
}
在不配置XML列表的情况下,如何将A的一些实现自动连接到聚合器中
编辑:我正在寻找一种能够控制列表成员的方法
@Autowired
始终使用类的实例,而不是类型。您已经定义了3种类型:A
、B
和C
,但尚未从中创建任何实例
要自动连线,您需要创建这些实例,并向Spring注册它们。这就是XML配置或Java配置的用武之地。它基本上是创建Spring注册实例的一种简短形式。因此,您可以指定:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfiguration {
@Bean
public B someA() {
return new B();
}
@Bean
public C anotherA() {
return new C();
}
@Bean
public B evenMoreA() {
return new B();
}
}
这将为您提供3个独立的实例bean(不是列表)。有关更多详细信息,请参阅
现在,Spring将在这些包中查找A
类型的所有bean,并用这三个bean正确地填充您的聚合器
类
注意:这些bean不需要在同一个文件中。它们可以在@ComponentScan
包中的任何位置声明
正如一篇评论中提到的,如果您只想拥有其中的一些实例,该怎么办 如果您只想将一些bean添加到列表中,那么情况就更加棘手了。您需要将被排除的bean移动到不同包中的一个单独的
@Configuration
类中。您不应该将该新包添加到Spring@ComponentScan
包中,因此Spring将找不到要添加到列表中的bean。据我所知,这是唯一的办法
当然,如果您只想要一个bean,那么像往常一样,您必须使用
@Qualifier
自动连接它并指定bean名称。在本例中,您不使用列表
,只使用a
类型的变量,我问过如何在没有配置的情况下使用java来实现这一点。@user1050389 ah fair,将添加一个JavaConfig示例。您提到它提供了三个独立的bean,而不是列表。这些独立bean会自动连接成一个列表吗?否则它不能回答这个问题。好的,我看到你也提到了。谢谢但是,如果我只想拥有其中的一些实例呢?@user1050389作为编辑回答了您的补充问题。检查答案。