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