我希望@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,很容易忘记设置某些对象。
答案 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的方式没有任何影响。