Spring 无法创建 bean
Spring not able to create bean
我是 spring 及其概念的初学者。我正在尝试使用 @Configuration 和 package-scan 注释来扫描单个包下的某些 bean 提供程序 classes。当 class 之一的 @Bean 注释方法与另一个 class 的另一个 @Bean 注释方法同名时,不会为这两个 class 创建 bean。如果我将 @bean 注释的方法名称更改为未创建的 bean 的不同名称,则两个 bean 都已成功创建。无法理解这种行为。
@Configuration
public class ManagementHelperProvider {
@Bean
public ManagementHelper getInstance() {
return new ManagementHelper();
}
}
如果我正在创建另一个 Class 像下面这样的顶部 Bean ManagementHelper 不会被创建。
@Configuration
public class ManagementValidatorProvider {
@Bean
public ManagementValidator getInstance() {
return new ManagementValidator();
}
}
如果我正在创建另一个 Class,就像下面创建的顶部 Bean ManagementHelper。
@Configuration
public class ManagementValidatorProvider {
@Bean
public ManagementValidator getInstanceTwo() {
return new ManagementValidator();
}
}
案例一:
用名称 getInstance.
创建的 bean1
用相同名称 getInstance 创建的 bean2 和 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>
两者都会导致名为 transferService 的 bean 在 BeanFactory/ApplicationContext 中可用,绑定到 TransferServiceImpl 类型的对象实例:
transferService => com.acme.TransferService
由于您试图覆盖一个 bean,它会抛出异常
如果你还想做的话。
参考setAllowBeanDefinitionOverriding - https://docs.spring.io/spring/docs/2.5.x/javadoc-api/org/springframework/beans/factory/support/DefaultListableBeanFactory.html#setAllowBeanDefinitionOverriding%28boolean%29
或
您可以使用名称 属性
简单地更改 bean 的名称
- @Bean(名字="name1")
- @Bean(名字="name2")
默认情况下,spring中的bean是单例的,只需要在上下文中定义一次。组件扫描将搜索所有文件。
您无需多次定义getInstance(),一次即可!为清楚起见,将此方法重命名如下:
@Bean
public ManagementHelper getManagementHelperInstance() {
return new ManagementHelper();
}
在其他classes中需要依赖的地方在你的class中添加如下作为成员变量
@Inject
ManagementHelper managementHelperInstance
如果您不想在多个地方(不是单例)使用相同的 ManagementHelper,则将 MangementHelper class 注释为原型,这将在每次请求时创建一个新的 bean 实例,不只是 return 同一个,即
@Scope("prototype")
public class ManagementHelper
我是 spring 及其概念的初学者。我正在尝试使用 @Configuration 和 package-scan 注释来扫描单个包下的某些 bean 提供程序 classes。当 class 之一的 @Bean 注释方法与另一个 class 的另一个 @Bean 注释方法同名时,不会为这两个 class 创建 bean。如果我将 @bean 注释的方法名称更改为未创建的 bean 的不同名称,则两个 bean 都已成功创建。无法理解这种行为。
@Configuration
public class ManagementHelperProvider {
@Bean
public ManagementHelper getInstance() {
return new ManagementHelper();
}
}
如果我正在创建另一个 Class 像下面这样的顶部 Bean ManagementHelper 不会被创建。
@Configuration
public class ManagementValidatorProvider {
@Bean
public ManagementValidator getInstance() {
return new ManagementValidator();
}
}
如果我正在创建另一个 Class,就像下面创建的顶部 Bean ManagementHelper。
@Configuration
public class ManagementValidatorProvider {
@Bean
public ManagementValidator getInstanceTwo() {
return new ManagementValidator();
}
}
案例一:
用名称 getInstance.
创建的 bean1用相同名称 getInstance 创建的 bean2 和 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>
两者都会导致名为 transferService 的 bean 在 BeanFactory/ApplicationContext 中可用,绑定到 TransferServiceImpl 类型的对象实例:
transferService => com.acme.TransferService
由于您试图覆盖一个 bean,它会抛出异常
如果你还想做的话。
参考setAllowBeanDefinitionOverriding - https://docs.spring.io/spring/docs/2.5.x/javadoc-api/org/springframework/beans/factory/support/DefaultListableBeanFactory.html#setAllowBeanDefinitionOverriding%28boolean%29
或
您可以使用名称 属性
简单地更改 bean 的名称- @Bean(名字="name1")
- @Bean(名字="name2")
默认情况下,spring中的bean是单例的,只需要在上下文中定义一次。组件扫描将搜索所有文件。
您无需多次定义getInstance(),一次即可!为清楚起见,将此方法重命名如下:
@Bean
public ManagementHelper getManagementHelperInstance() {
return new ManagementHelper();
}
在其他classes中需要依赖的地方在你的class中添加如下作为成员变量
@Inject
ManagementHelper managementHelperInstance
如果您不想在多个地方(不是单例)使用相同的 ManagementHelper,则将 MangementHelper class 注释为原型,这将在每次请求时创建一个新的 bean 实例,不只是 return 同一个,即
@Scope("prototype")
public class ManagementHelper