Java Spring无法创建bean
我是spring及其概念的初学者。我试图使用@Configuration和package scan注释来扫描单个包下的一些bean提供程序类。当其中一个类的@Bean注释方法与另一个不同类的@Bean注释方法同名时,不会为这两个类创建Bean。如果我将@bean注释的方法名称更改为未创建的bean的不同名称,则两个bean都会成功创建。无法理解这种行为Java Spring无法创建bean,java,spring,spring-mvc,autowired,Java,Spring,Spring Mvc,Autowired,我是spring及其概念的初学者。我试图使用@Configuration和package scan注释来扫描单个包下的一些bean提供程序类。当其中一个类的@Bean注释方法与另一个不同类的@Bean注释方法同名时,不会为这两个类创建Bean。如果我将@bean注释的方法名称更改为未创建的bean的不同名称,则两个bean都会成功创建。无法理解这种行为 @Configuration public class ManagementHelperProvider { @
@Configuration
public class ManagementHelperProvider {
@Bean
public ManagementHelper getInstance() {
return new ManagementHelper();
}
}
如果我正在创建另一个类似下面的类,则不会创建top 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();
}
}
案例1: 使用名称getInstance创建的bean1 使用相同名称创建的bean2getInstance,而bean1被该名称覆盖 案例2: 使用名称getInstance创建bean1 使用名称getInstanceTwo创建bean2。没有覆盖,因为名称中没有冲突 如果你
@Bean(name="bean1")
及
它也会起作用
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
上面的完全等同于以下appConfig.xml:
<beans>
<bean name="transferService" class="com.acme.TransferServiceImpl"/>
</beans>
由于您试图覆盖bean,它将抛出异常 如果你还想做的话 请参阅SetAllowBean定义覆盖- 或 您可以使用name属性简单地更改bean的名称
- @Bean(name=“name1”)
- @Bean(name=“name2”)
- 默认情况下,spring中的bean是单例的,只需要在上下文中定义一次。组件扫描将搜索所有文件
您不需要多次定义getInstance(),只需定义一次!为清晰起见,请按如下方式重命名此方法:
@Bean
public ManagementHelper getManagementHelperInstance() {
return new ManagementHelper();
}
如果需要在其他类中依赖它,请在类中添加以下内容作为成员变量
@Inject
ManagementHelper managementHelperInstance
如果您不想在多个位置(而不是单个位置)使用同一个ManagementHelper,那么将MangementThelper类注释为原型,这将在每个请求上创建一个新的bean实例,而不仅仅是返回相同的实例,即
@Scope("prototype")
public class ManagementHelper
如果您没有为
@Bean
注释提供名称
元素,Bean方法的名称将成为相应Bean的唯一标识符。@SotiriosDelimanolis-这很奇怪,因为我可以定义两个具有相同名称的Bean,一个如果被另一个覆盖-因此它们不能是唯一的,只是名称
,不是id
@mszymborski-Spring不会抱怨,它只是用相同的名称覆盖以前的bean定义,以便发现它们。@SotiriosDelimanolis-因此我对作者声称它不存在感到惊讶work@mszymborski其中一个bean将不会被创建。这就是我对这个问题的解释。
@Inject
ManagementHelper managementHelperInstance
@Scope("prototype")
public class ManagementHelper