【问题标题】:Spring autowire by name constructor argumentsSpring按名称构造函数参数自动装配
【发布时间】:2014-09-29 10:18:05
【问题描述】:

我们有一个包含数千个 bean 的大型 java 应用程序,分析缓慢的 spring 上下文初始化,我们发现按类型自动连接是占用大部分上下文加载时间的原因。 按名称自动装配 bean 似乎将上下文初始化提高了一个数量级。 但是我找不到按名称自动连接 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 名称分离),但在这一点上,上下文加载性能是我们最关心的问题。

【问题讨论】:

  • 在代码中添加注释(元数据)的全部意义在于实现“类型安全注入”。您想放弃此注射器的基本功能。也许解决这个问题的正确方法是让您的应用程序更加模块化,这样您就不必构建一个巨大的 ApplicationContext。
  • 为什么不能只在配置中配置这些bean?

标签: java spring constructor autowired


【解决方案1】:

我知道它现在有点过时了,但是在 xml 中按名称连接真的很容易,而且 Spring 支持 xml 和 java 配置的混合。

提供beanmyBean定义在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 的建议。

【讨论】:

  • 好的,谢谢,我知道我可以做到,我想知道是否有办法继续使用组件扫描和布线方法,如果我可以告诉 spring 使用按名称布线。
猜你喜欢
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多