我有一些集成测试,应该模拟出系统中许多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,则从方法名称(在您的情况下为realBean / getRealBean)中提取bean的名称。
当使用不带属性的@Component
注释(指定bean名称)时,bean的名称是从方法名称first letter is lowercased中提取的。
因此,在第一种情况下,您会遇到名称冲突。您不能有两个名为realBean
的bean。
您的第二个示例没有冲突,因为用@Component
注释的bean名称为realBean
,通过@Bean
注册的第二个bean名称为getRealBean
。@Primary
注释可帮助Spring选择是否存在两个相同类型的bean并按类型注入。当按名称注入(使用@Qualifier
批注)时,也可以注入辅助实例。