簡體   English   中英

Spring Autowire按名稱構造函數的參數

[英]Spring autowire by name constructor arguments

我們有一個包含數千個bean的大型Java應用程序,對緩慢的Spring上下文初始化進行了性能分析,我們發現按類型進行自動裝配占用了大多數上下文加載時間。 按名稱自動裝配Bean似乎可以將上下文初始化提高一個數量級。 但是我找不到一種通過名稱自動構造構造器參數的方法。

以下是自動裝配的成員工作正常,spring按名稱進行查找:

class MyClass {
   @Resource
   private MyBean mybean;
}

但是由於@Resource僅適用於成員和方法,因此不適用於構造函數。 我們嘗試了使用@Named的@Inject和使用@Qualifier的@Autowired,但是Spring對這些方法進行了按類型的慢速查找:

class MyClass {
   @Inject
   public MyClass(@Named("myBean") MyBean myBean) {
   }
}

class MyClass {

   @Autowired
   public MyClass(@Qualifer("myBean") MyBean myBean) {
   }
}

使用構造函數注入時如何告訴Spring不按類型查找?

我們了解按類型連接(與bean名稱脫鈎)的優勢,但此時,上下文加載性能是我們最大的擔憂。

我知道它現在有點過時了,但是按名稱連接在xml中確實很容易,並且Spring支持xml和java配置的混合。

提供的bean myBean是在java配置的xml中定義的,可以編寫

<bean id="myClass" class="...MyClass">
    <constructor-arg ref = "myBean"/>
</bean>

或在有多個參數的情況下:

<bean id="myClass" class="...MyClass">
    <constructor-arg index="0" ref = "myBean"/>
    <constructor-arg index="1" ref = "myOtherBean"/>
</bean>

編輯

或者,您可以通過java config進行以下操作:

@Configuration
public class MyClassConfig() {

@Autowire
@Qualifier("myBean")
MyBean myBean;

@Bean
MyClass myclass = new MyClass(myBean);
}

感謝jny提出建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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