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

在使用 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);

    }


    ....   

}


交互式爱情
浏览 137回答 2
2回答

慕运维8079593

最近有一个非常相似的问题。有2种情况:案例 1:没有限定符的覆盖@Configurationpublic MongoConfiguration extends AbstractConfiguration {    public MongoClient mongoClient(){        ....    }    @Override    @Bean    public MongoTemplate mongoTemplate() throws Exception {          MongoTemplate template = super.mongoTemplate();          template.setWriteResultChecking(WriteResultChecking.EXCEPTION);    }    ....   }在这种情况下,将使用您的覆盖定义而不是您的父定义来注册 bean。此外,只有 1 个 bean将被注册。案例 2:使用限定符覆盖@Configurationpublic 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 (mongoTemplate和myBean)。但是,对于两个 bean 的创建,将使用您覆盖的实现。

蝴蝶刀刀

您@Override在这种情况下使用的事实与覆盖 Spring Bean 的概念没有直接关系。Spring 按名称跟踪 bean,并且可以用另一个具有相同名称的 bean 替换一个 bean——这不经常使用,但有时需要绕过棘手的情况。@Override特别是 Java 继承位。在您的情况下,您的设置应该按预期工作,因为当 Spring 实例化您的 bean 时,它会调用MongoConfiguration#mongoTemplate(). 如果定义在不同的类中,那么它们都将生成名为 的 bean mongoTemplate,并且最后一个评估的会获胜(有一些技巧可以显式地控制它,使用@Order或注入其他配置,但这并不理想)。请注意,在这种特定情况下,您可能更喜欢使用 Spring Boot 自动配置,在这种情况下您不会覆盖 Java 方法。相反,您可以注入MongoTemplate并在其上调用 setter 方法,方法是编写 anApplicationRunner或监听ContextRefreshedEvent.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java