我有一些集成测试,应该模拟我系统中的许多 bean 之一。为此,我有一个如下所示的 @Configuration
:
@Configuration
public class MockContext {
@Primary
@Bean
public RealBean realBean() {
return new MockBean();
}
}
我注意到,如果RealBean
是一个没有@Component
的java类,那么就会使用这个方法。但如果 RealBean
是一个 @Component
,我必须将此上下文方法更改为如下所示:
@Configuration
public class MockContext {
@Primary
@Bean
public RealBean getRealBean() {
return new MockBean();
}
}
任何人都可以解释为什么我需要更改此方法名称以及在哪里可以找到所有这些规则?解决这些“为什么我的 MockContext
不能正常工作?”的问题需要很长时间。问题。
FWIW,这是我在测试中使用此上下文的方式:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {RealContext.class, MockContext.class})
@WebAppConfiguration
public abstract class AbstractIntegrationTest {
我的集成测试将扩展这个类。我正在使用 Spring Boot 1.2.4.RELEASE
最佳答案
你可以用相同的类型注册不同的bean。但它们需要有不同的名称。
如果使用@Bean
注解without name attribute ,bean 的名称是从方法名称中提取的(在您的例子中是 realBean/getRealBean)。
当您使用不带属性(指定 bean 名称)的 @Component
注释时,bean 的名称将从方法名称中提取,其中 first letter is lowercased .
因此,在您的第一个案例中,您会遇到名称冲突。您不能有两个名为 realBean
的 Bean。
您的第二个示例没有冲突,因为由 @Component
注释的 bean 具有名称 realBean
,而通过 @Bean
注册的第二个 bean 具有名称 getRealBean
.
@Primary
注解可帮助 Spring 在有两个相同类型的 bean 并且您按类型注入(inject)时选择选择哪个 bean。当您按名称注入(inject)(使用@Qualifier
注释)时,您还可以注入(inject)辅助实例。
关于java - bean 的 @Configuration 命名规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31324757/