Spring无法创建bean

时间:2016-07-25 19:25:18

标签: java spring spring-mvc autowired

我是春天的初学者及其概念。我正在尝试使用@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();
        }
    }

3 个答案:

答案 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的名称即可
  • @Bean(name =“name1”)
  • @Bean(名称= “NAME2”)

答案 2 :(得分:0)

默认情况下,spring中的bean是单例,只需要在上下文中定义一次。组件扫描将搜索所有文件。

您不需要多次定义getInstance(),只需一次!为清楚起见,重命名此方法如下:

@Inject
ManagementHelper managementHelperInstance

如果您需要在其他类中依赖它,请在您的类中将以下内容添加为成员变量

@Scope("prototype")
public class ManagementHelper 

如果您不想在多个地方(而不是单个)使用相同的ManagementHelper,那么将MangementHelper类注释为原型,这将在每个请求上创建一个新的bean实例,而不仅仅返回相同的即

extern volatile bool Sweep_CW;