如果我在java配置中覆盖bean定义会发生什么?

问题描述 投票:0回答:2

使用Spring Data Mongodb进行开发时,我想在MongoDB配置中进行一些自定义。一般情况下,我将扩展AbstractMongoConfiguration,并实现抽象方法。目前,AbstractMongoConfiguration类具有以下内容:

@Configuration
public abstract AbstractConfiguration extends MongoConfigurationSupport {
    public abstract MongoClient mongoClient();

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {
          return new MongoTemplate(mongoDbFactor(), mappingMongoConverter());

    ....   
}

在扩展这个类时,我想自定义bean MongoTemplate,所以我想覆盖mongoTemplate方法,这有用吗?

@Configuration
public MongoConfiguration extends AbstractConfiguration {
    public MongoClient mongoClient(){
        ....
    }

    @Override
    @Bean
    public MongoTemplate mongoTemplate() throws Exception {
          MongoTemplate template = super.mongoTemplate();
          template.setWriteResultChecking(WriteResultChecking.EXCEPTION);
    }

    ....   
}
java spring mongodb configuration override
2个回答
0
投票

在这种情况下你使用@Override的事实与覆盖Spring Bean的概念没有直接关系。 Spring按名称跟踪bean,并且可以将bean替换为另一个具有相同名称的bean - 这种情况并不经常使用,但有时需要绕过棘手的情况。 @Override特别是Java继承位。

在您的情况下,您的设置应该按预期工作,因为当Spring实例化您的bean时,它将调用MongoConfiguration#mongoTemplate()。如果定义在不同的类中,那么它们都将生成名为mongoTemplate的bean,并且最后一个被评估将获胜(有明确控制这个的技巧,使用@Order或注入其他配置,但它并不理想)。

请注意,在这种特定情况下,您可能更喜欢使用Spring Boot自动配置,在这种情况下,您不会覆盖Java方法。相反,您可以通过编写MongoTemplate或者监听ApplicationRunner来注入ContextRefreshedEvent并在其上调用setter方法。


0
投票

最近有一个非常相似的问题。

有两种情况:

Case-1: Overriding without a qualifier

@Configuration
public MongoConfiguration extends AbstractConfiguration {
    public MongoClient mongoClient(){
        ....
    }

    @Override
    @Bean
    public MongoTemplate mongoTemplate() throws Exception {
          MongoTemplate template = super.mongoTemplate();
          template.setWriteResultChecking(WriteResultChecking.EXCEPTION);
    }

    ....   
}

在这种情况下,将使用重写的定义而不是父定义来注册bean。此外,只会注册1个bean。

Case-2: Overriding with a qualifier

@Configuration
public MongoConfiguration extends AbstractConfiguration {
    public MongoClient mongoClient(){
        ....
    }

    @Override
    @Bean(name="myBean")
    public MongoTemplate mongoTemplate() throws Exception {
          MongoTemplate template = super.mongoTemplate();
          template.setWriteResultChecking(WriteResultChecking.EXCEPTION);
    }

    ....   
}

在这种情况下,将创建2个bean(mongoTemplatemyBean)。但是,为了创建两个bean,将使用重写的实现。

© www.soinside.com 2019 - 2024. All rights reserved.