将参考bean按类型自动连接到列表中

发布于 2021-01-31 15:31:07

我有一类具有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上的某个地方看到了这个问题,但无法再次找到它。对此表示歉意。

关注者
0
被浏览
84
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看