2 回答
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 的创建,将使用您覆盖的实现。
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
.
添加回答
举报