簡體   English   中英

如何使用非空構造函數自動連接類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM