[英]How to autowire a class with non-empty constructor?
我想@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
更好的方法? 我不希望這種方法,因為理想情況下,構造函數會強制其他類提供服務中所需的所有對象。 如果使用設置器,則很容易忘記設置某些對象。
如果要讓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文檔 。 要解決您對另一個答案的評論,可以使用 XML 創建一個List bean ,如Spring文檔中所示。 如果列表數據是固定的(可能不是固定的),那么您想使用實例工廠方法來實例化bean。
簡而言之,您尋求的答案都在Spring文檔中:)
如果組件具有非默認構造函數,則需要在bean配置中配置構造函數。
如果您使用的是XML,則可能看起來像這樣(來自spring參考文檔的示例):
<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的方式沒有影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.