java - bean 的 @Configuration 命名规则是什么?

标签 java spring dependency-injection spring-boot spring-ioc

我有一些集成测试,应该模拟我系统中的许多 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/

相关文章:

java - Spring Cloud - 配置客户端缓存属性

Scala Play 测试在依赖注入(inject)期间找不到 WSClient

java - EJB。无法注入(inject) session bean

java - 从数组中删除从键盘输入读取的特定元素

java - 以新格式格式化我返回的 xml 响应字符串

java - 具有嵌套属性的 JPA MapKey

java - Hazelcast MBean 丢失

spring - 使用 @AfterReturning spring aop 时缺少参数

javascript - 巴贝尔,Webpack,ES6, react : Importing module then passing imported module as prop to child

javascript - Angular2 中没有服务提供者错误,为什么我需要将其注入(inject)到它的父组件中?