Spring通过名称构造函数参数自动装配

时间:2014-08-06 12:58:46

标签: java spring constructor autowired

我们有一个包含数千个bean的大型java应用程序,分析缓慢的弹簧上下文初始化,我们发现按类型自动连接是大多数上下文加载时间。 按名称自动装配bean似乎可以将上下文初始化提高一个数量级。 但是,我无法找到一种方法来通过名称自动连接bean作为构造函数参数。

以下是成员autowire工作正常,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名称解耦),但在这一点上下文加载性能是我们最关心的问题。

1 个答案:

答案 0 :(得分:0)

我知道它现在有点过时,但在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配置方式,您可以:

@Configuration
public class MyClassConfig() {

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

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

感谢jny提出建议。