что произойдет, если я переопределю определение bean-компонента в конфигурации Java? - PullRequest
0 голосов
/ 11 ноября 2018

При разработке с 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);
    }

    ....   
}

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

В последнее время возникла чрезвычайно похожая проблема.

Есть 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);
    }

    ....   
}

В этом случае бин будет зарегистрирован с использованием вашего переопределенного определения, а не определения вашего родителя. Также, будет зарегистрирован только 1 бин .

Случай 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). Но для создания обоих компонентов будет использована ваша переопределенная реализация.

0 голосов
/ 11 ноября 2018

Тот факт, что вы используете @Override в этом случае, не имеет прямого отношения к концепции переопределения Spring Bean. Spring отслеживает bean-компоненты по имени, и можно заменить bean-компонент на другой с тем же именем - это используется не очень часто, но иногда необходимо обходить сложные ситуации. @Override определенно является битом наследования Java.

В вашем случае ваша установка должна работать так, как вы ожидаете, потому что, когда Spring создает экземпляр вашего компонента, он будет вызывать MongoConfiguration#mongoTemplate(). Если бы определения были в разных классах, то они оба производили бы бины с именем mongoTemplate, и последний из оцененных выиграл бы (есть хитрые приемы для контроля этого явно, либо с использованием @Order, либо путем внедрения другой конфигурации, но это не так. идеал).

Обратите внимание, что в этом конкретном случае вы можете предпочесть автоматическую настройку Spring Boot, и в этом случае вы не переопределите метод Java. Вместо этого вы можете ввести MongoTemplate и просто вызвать для него метод setter, либо написав ApplicationRunner, либо прослушивая ContextRefreshedEvent.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...