我是春天的初学者及其概念。我正在尝试使用@Configuration和package-scan注释来扫描单个包下的一些bean提供程序类。当其中一个类的@Bean注释方法与另一个类的另一个@Bean注释方法具有相同的名称时,两个类的bean创建都不会发生。如果我将@bean注释方法名称更改为未创建的bean的其他名称,则会成功创建两个bean。无法理解这种行为。
@Configuration
public class ManagementHelperProvider {
@Bean
public ManagementHelper getInstance() {
return new ManagementHelper();
}
}
如果我正在创建另一个类,如下所示,则不会创建顶级Bean ManagementHelper。
@Configuration
public class ManagementValidatorProvider {
@Bean
public ManagementValidator getInstance() {
return new ManagementValidator();
}
}
如果我在下面创建另一个类,则会创建最高的Bean ManagementHelper。
@Configuration
public class ManagementValidatorProvider {
@Bean
public ManagementValidator getInstanceTwo() {
return new ManagementValidator();
}
}
答案 0 :(得分:2)
<强>情况1:强>
使用名称 getInstance 创建的bean1。
bean2使用相同的名称 getInstance 创建,bean1被覆盖。
<强>情况2:强>
使用名称getInstance创建的bean1。
使用名称getInstanceTwo创建的bean2。没有覆盖,因为名称中没有冲突。
如果你
@Bean(name="bean1")
和
@Bean(name="bean2")
它也可以。
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
以上完全等效以下 appConfig.xml :
<beans>
<bean name="transferService" class="com.acme.TransferServiceImpl"/>
</beans>
两者都会导致BeanFactory / ApplicationContext中有一个名为 transferService 的bean,绑定到TransferServiceImpl类型的对象实例:
transferService => com.acme.TransferService
答案 1 :(得分:1)
由于您尝试覆盖bean,因此会抛出异常
如果你还想这样做。
请参阅setAllowBeanDefinitionOverriding - https://docs.spring.io/spring/docs/2.5.x/javadoc-api/org/springframework/beans/factory/support/DefaultListableBeanFactory.html#setAllowBeanDefinitionOverriding%28boolean%29
或
您只需使用名称属性
更改bean的名称即可答案 2 :(得分:0)
默认情况下,spring中的bean是单例,只需要在上下文中定义一次。组件扫描将搜索所有文件。
您不需要多次定义getInstance(),只需一次!为清楚起见,重命名此方法如下:
@Inject
ManagementHelper managementHelperInstance
如果您需要在其他类中依赖它,请在您的类中将以下内容添加为成员变量
@Scope("prototype")
public class ManagementHelper
如果您不想在多个地方(而不是单个)使用相同的ManagementHelper,那么将MangementHelper类注释为原型,这将在每个请求上创建一个新的bean实例,而不仅仅返回相同的即
extern volatile bool Sweep_CW;