java - Spring 按名称构造函数参数 Autowiring

标签 java spring constructor autowired

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

以下是一个工作正常的成员 Autowiring ,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) {
   }
}

如何在使用构造函数注入(inject)时告诉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 配置方式:

@Configuration
public class MyClassConfig() {

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

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

感谢 jny 的建议。

关于java - Spring 按名称构造函数参数 Autowiring ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25161074/

相关文章:

java - 陈旧元素引用 : element is not attached to the page document for Java-Selenium

java - 导入org.hibernate.annotations.Immutable/Type时出错?

spring - 从 Spring Security 中的 Session 获取用户详细信息

c++ - 什么是构造函数继承?

java - 基元变量的别名

java - SimpleMessageListener 与 DirectMessageListener

forms - Spring MVC Restful 应用程序 : Redirect a form result to another page

java - 如何在没有objectId的情况下使用spring-data mongodb进行更新插入?

javascript - 父对象原型(prototype)继承的差异

javascript - 我如何调用一个函数,其名称是通过组合node.js中的一些变量动态创建的?