我目前正在将XML spring配置转换为Java注释,而且我遇到了一些烦人的情况。
我需要创建3个bean,它们在内部使用相同的类,但需要是单独的实例。但是,这些内部bean需要使用Spring注册其关闭方法。
我无法在没有在java中创建9个bean的情况下考虑如何做到这一点(这很好,但是像这样污染类似乎有点不对)
在XML配置中,它看起来像这样:
<bean class="outer1">
<constructor-arg>
<bean class="middle">
<constructor-arg>
<bean class="inner" />
</constructor-arg>
</bean>
</constructor-arg>
</bean>
<bean class="outer2">
<constructor-arg>
<bean class="middle">
<constructor-arg>
<bean class="inner" />
</constructor-arg>
</bean>
</constructor-arg>
</bean>
<bean class="outer3">
<constructor-arg>
<bean class="middle">
<constructor-arg>
<bean class="inner" />
</constructor-arg>
</bean>
</constructor-arg>
</bean>
答案 0 :(得分:4)
一种解决方案是:
@Configuration
public class MyConfig{
@Bean(destroyMethod="cleanup")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Inner inner(){
return new Inner();
}
@Bean(destroyMethod="cleanup")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Middle middle(){
return new Middle(inner());
}
@Bean
public Outer outer1(){
return new Outer(middle());
}
@Bean
public Outer outer2(){
return new Outer(middle());
}
@Bean
public Outer outer3(){
return new Outer(middle());
}
}
非单例,bean部署的原型范围导致了 每次请求特定时,都会创建一个新的bean实例 豆是制作的。
这意味着每次调用middle()和inner()方法都会创建一个新的bean实例。