为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

交互式爱情 2022-01-12 14:46:06
在使用 Spring Data Mongodb 进行开发时,我想在我的 MongoDB 配置中进行一些自定义。一般来说,我会扩展 AbstractMongoConfiguration,并实现抽象方法。目前,AbstractMongoConfiguration类具有以下内容:@Configurationpublic abstract AbstractConfiguration extends MongoConfigurationSupport {    public abstract MongoClient mongoClient();    @Bean    public MongoTemplate mongoTemplate() throws Exception {          return new MongoTemplate(mongoDbFactor(), mappingMongoConverter());    ....   }扩展这个类的时候,想自定义bean MongoTemplate,所以想重写mongoTemplate方法,这样行吗?@Configurationpublic MongoConfiguration extends AbstractConfiguration {    public MongoClient mongoClient(){        ....    }    @Override    @Bean    public MongoTemplate mongoTemplate() throws Exception {          MongoTemplate template = super.mongoTemplate();          template.setWriteResultChecking(WriteResultChecking.EXCEPTION);    }    ....   }
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

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


有2种情况:


案例 1:没有限定符的覆盖

@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将被注册。


案例 2:使用限定符覆盖

@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 (mongoTemplate和myBean)。但是,对于两个 bean 的创建,将使用您覆盖的实现。


查看完整回答
反对 回复 2022-01-12
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

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

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

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


查看完整回答
反对 回复 2022-01-12
  • 2 回答
  • 0 关注
  • 136 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信