Понимание имен переменных экземпляра и методов его создания с использованием аннотации Spring @Bean

Я написал простое Spring Boot Application, которое позже расширил бы для создания Spring REST-клиента. У меня есть рабочий код; Я попытался изменить несколько имен переменных экземпляра и имена методов и играть вокруг.

Код:

@SpringBootApplication
public class RestClientApplication {

public static void main(String[] args) {
    SpringApplication.run(RestClientApplication.class, args);

    try (AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
            RestClientApplication.class)) {
        System.out.println(" Getting RestTemplateBuilder : " + ctx.getBean("restTemplateBuilder"));
        System.out.println(" Getting RestTemplate : " + ctx.getBean("restTemplate"));
    }
}

@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
    return restTemplateBuilder.build();
}

@Bean
public CommandLineRunner runner() {
    return args -> { SOP("hello"); }
}

}

Замечания:

  1. Имена переменных экземпляра следуют за обозначением верблюжьего случая, как и ожидалось. Итак, restTemplate и restTemplateBuilder работают.
  2. При создании экземпляра RestTemplate с помощью метода restTemplate() я попытался изменить имя аргумента на builder. Оно работает.
  3. При создании экземпляра RestTemplate с помощью метода restTemplate() я попытался изменить имя метода на случайное, и я получил исключение: "Нет доступного компонента с именем restTemplate".
  4. Интерфейс CommandLineRunner реализован с помощью лямбда-выражения. Доступ к commandLineRunner вызывает исключение.

Вопрос

Почему я вижу результаты, упомянутые в пунктах № 2 и № 3?

1 ответ

Решение

При создании экземпляра RestTemplate с помощью метода restTemplate() я попытался изменить имя аргумента на builder. Оно работает.

Это работает потому, что по умолчанию пружинный автопровод по типу. Таким образом, он ищет бин с типом RestTemplateBuilder и он находит это и, следовательно, без ошибок.

При создании экземпляра RestTemplate с помощью метода restTemplate() я попытался изменить имя метода на случайное, и я получил исключение: "Нет доступного компонента с именем restTemplate".

Вы получаете исключение не потому, что вы изменили имя метода, а из-за этого

ctx.getBean("restTemplate")

Потому что по умолчанию @Bean использует имя метода в качестве имени компонента. ( проверьте это). Таким образом, имя bean-компонента типа RestTemplate, которое возвращается вашим случайным методом, является именем вашего случайного метода. Следовательно, когда вы пытаетесь получить бин с именем restTemplateИсключение.

Но если бы вы использовали Autowire для bean-компонента типа RestTemplate, он все равно работал бы, потому что Spring по умолчанию будет использовать Autowire по типу, и он знает bean-компонент типа RestTemplate (name как случайное имя метода).

Другие вопросы по тегам