Lio*_*orH 5 java spring constructor autowired
我们有一个包含数千个bean的大型Java应用程序,对缓慢的Spring上下文初始化进行了性能分析,我们发现按类型进行自动装配占用了大多数上下文加载时间。按名称自动装配Bean似乎可以将上下文初始化提高一个数量级。但是我找不到一种通过名称自动构造构造器参数的方法。
以下是自动装配的成员工作正常,spring按名称进行查找:
class MyClass {
@Resource
private MyBean mybean;
}
Run Code Online (Sandbox Code Playgroud)
但是由于@Resource仅适用于成员和方法,因此不适用于构造函数。我们尝试了使用@Named的@Inject和使用@Qualifier的@Autowired,但是Spring对这些方法进行了按类型的慢速查找:
class MyClass {
@Inject
public MyClass(@Named("myBean") MyBean myBean) {
}
}
class MyClass {
@Autowired
public MyClass(@Qualifer("myBean") MyBean myBean) {
}
}
Run Code Online (Sandbox Code Playgroud)
使用构造函数注入时如何告诉Spring不按类型查找?
我们了解按类型连接(与bean名称脱钩)的优势,但是此时上下文加载性能是我们最大的担忧。
我知道现在有点过时了,但是在 xml 中按名称进行连接确实很容易,而且 Spring 支持混合 xml 和 java 配置。
提供的beanmyBean是在java配置的xml中定义的,可以这样写
<bean id="myClass" class="...MyClass">
<constructor-arg ref = "myBean"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
或者如果有多个参数:
<bean id="myClass" class="...MyClass">
<constructor-arg index="0" ref = "myBean"/>
<constructor-arg index="1" ref = "myOtherBean"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
编辑
或者,以 java 配置方式,您可以:
@Configuration
public class MyClassConfig() {
@Autowire
@Qualifier("myBean")
MyBean myBean;
@Bean
MyClass myclass = new MyClass(myBean);
}
Run Code Online (Sandbox Code Playgroud)
感谢 jny 的建议。
| 归档时间: |
|
| 查看次数: |
6860 次 |
| 最近记录: |