使用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);
}
....
}
在这种情况下你使用@Override
的事实与覆盖Spring Bean的概念没有直接关系。 Spring按名称跟踪bean,并且可以将bean替换为另一个具有相同名称的bean - 这种情况并不经常使用,但有时需要绕过棘手的情况。 @Override
特别是Java继承位。
在您的情况下,您的设置应该按预期工作,因为当Spring实例化您的bean时,它将调用MongoConfiguration#mongoTemplate()
。如果定义在不同的类中,那么它们都将生成名为mongoTemplate
的bean,并且最后一个被评估将获胜(有明确控制这个的技巧,使用@Order
或注入其他配置,但它并不理想)。
请注意,在这种特定情况下,您可能更喜欢使用Spring Boot自动配置,在这种情况下,您不会覆盖Java方法。相反,您可以通过编写MongoTemplate
或者监听ApplicationRunner
来注入ContextRefreshedEvent
并在其上调用setter方法。
最近有一个非常相似的问题。
有两种情况:
@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。
@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,将使用重写的实现。