Нужно ли создавать bean-компонент для всех встроенных классов в Spring Boot? - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь настроить RabbitMQ с помощью Spring Boot. Ниже приведен снимок моего класса конфигурации.

Случай 1:

   @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        template.setMessageConverter(new Jackson2JsonMessageConverter());            
        return template;
    }

Этот код отлично работает.

Код 2:

       @Bean
        public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
            RabbitTemplate template = new RabbitTemplate(connectionFactory);
    //      template.setMessageConverter(new Jackson2JsonMessageConverter()); // Line 1 - works
   //       template.setMessageConverter(messageConverter); // Line 2 - error: asks to inject Bean
            return template;
        }

В этом случае, однако, код работает нормально, если я использую строку 1, где я создаю объект Jackson2JsonMessageConverter.

Но я пишу этот код, чтобы понять работу уже существующего кода, где вместо строки 1 используется строка 2. Поэтому, когда я использую строку 2 вместо строки 1, я получаю сообщение об ошибке:

Рассмотрите возможность определения bean-компонента типа 'org.springframework.amqp.support.converter.MessageConverter' в вашей конфигурации.

Итак, у меня есть 2 вопроса:

  1. Почему эта ошибка?
  2. Если я определю bean-компонент для MessageConverter, скажем

    @ Bean publi c MessageConverter createMessageConverter () {вернуть новый Jackson2JsonMessageConverter (); }

тогда это работает. Тогда почему он не просит меня определить bean-компонент для аргумента ConnectionFactory?

PS: не используется ни @Autowired, ни здесь, ни в коде, который я пытаюсь понять, и оба аргумента, ConnectionFactory и MessageConverter, являются интерфейсы а не классы

1 Ответ

2 голосов
/ 31 марта 2020

Короткий ответ таков: вам нужно понять концепцию AutoConfiguratrions в Spring Boot, которая создаст для вас множество @Beans, а вы их не «увидите».

Очень хорошая статья для понимания Автоконфигурации это:

https://www.marcobehler.com/guides/spring-boot

В вашем случае вы также можете взглянуть на класс "RabbitAutoConfiguration" из исходного кода Spring Boot.

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