将参考bean按类型自动连接到列表中
我有一类具有Daemon
类型的对象列表。
class Xyz {
List<Daemon> daemons;
}
我的弹簧配置看起来像这样。
<bean id="xyz" class="package1.Xyz">
<property name="daemons" ref="daemonsList">
</bean>
<bean id="daemon1" class="package1.DaemonImpl1"/>
<bean id="daemon2" class="package1.DaemonImpl2"/>
<bean id="daemonsList" class="java.util.ArrayList">
<constructor-arg>
<list>
<ref bean="daemon1" />
<ref bean="daemon2" />
</list>
</constructor-arg>
</bean>
现在,可以Daemon
在列表中自动自动连接所有类型的bean,而不是显式连接列表中的每个守护程序实现。我要解决的问题是,如果有人创建了Daemon
类的新实现的bean,却忘记将其连接到列表中。
我已经在stackoverflow上的某个地方看到了这个问题,但无法再次找到它。对此表示歉意。
-
它应该像这样工作(从您的XML中删除ArrayList bean):
public Class Xyz { private List<Daemon> daemons; @Autowired public void setDaemons(List<Daemon> daemons){ this.daemons = daemons; } }
我认为没有办法在XML中做到这一点。
请参阅:
3.9.2。@Autowired
和@Inject
:通过将注释添加到需要该类型数组的字段或方法中,还可以从ApplicationContext提供特定类型的所有bean:
public class MovieRecommender { @Autowired private MovieCatalog[] movieCatalogs; // ... }
同样适用于类型化的集合:
public class MovieRecommender { private Set<MovieCatalog> movieCatalogs; @Autowired // or if you don't want a setter, annotate the field public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) { this.movieCatalogs = movieCatalogs; } // ... }
顺便说一句,从Spring 4.x开始,这些列表可以使用
@Ordered
机制自动排序。