it-swarm.cn

按类型将引用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上的某个地方看到过这个问题,但是无法再找到它。为此道歉。

63
RandomQuestion

它应该像这样工作(从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机制自动排序

66
Sean Patrick Floyd