如何使用非空构造函数自动装配类?

时间:2014-06-18 13:13:10

标签: java spring autowired

我希望@Autowired一个具有非空构造函数的类。 仅作为示例,它不一定必须是视图/服务。可以是你喜欢的任何组件,具有非默认构造函数:

@Component
class MyViewService {
  //the "datasource" to show in the view
  private List<String> companies companies;
  private MyObject obj;

  public MyViewService(List<String> companies, MyObject obj) {
    this.companies = companies;
    this.obj = obj;
  }
}

当然我不能写

@Autowired
private MyViewService viewService;

因为我想在列表中使用构造函数。但是如何?

是否有更好的方法而不是将这些构造函数重构为setters?我不喜欢这种方法,理想情况下,构造函数强制其他类提供服务中所需的所有对象。如果我使用setter,很容易忘记设置某些对象。

2 个答案:

答案 0 :(得分:2)

如果你想让Spring管理MyViewService,你必须告诉Spring如何创建它的实例。如果您正在使用XML配置:

<bean id="myViewService" class="org.membersound.MyViewService">
  <constructor-arg index="0" ref="ref_to_list" />
  <constructor-arg index="1" ref="ref_to_object" />
</bean>

如果您正在使用Java配置,那么您可以在@Bean带注释的方法中自行调用构造函数。

查看有关此主题的Spring docs。为了解决您对另一个答案所做的评论,您可以使用XML create a List bean,如Spring文档中所示。如果列表数据没有修复(可能没有),那么你想使用instance factory method来实例化bean。

简而言之,您寻求的答案都在Spring文档中:)

答案 1 :(得分:0)

如果组件具有非默认构造函数,则需要在bean配置中配置构造函数。

如果您使用的是XML, 它可能看起来像这样(来自spring reference document的例子):

<beans>
    <bean id="foo" class="x.y.Foo">
        <constructor-arg ref="bar"/>
        <constructor-arg ref="baz"/>
    </bean>

    <bean id="bar" class="x.y.Bar"/>
    <bean id="baz" class="x.y.Baz"/>
</beans>

这里的关键是将用于@AutoWire的bean的构造函数接线。 你使用bean的方式没有任何影响。