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