Понимание имен переменных экземпляра и методов его создания с использованием аннотации Spring @Bean - PullRequest
0 голосов
/ 30 августа 2018

Я написал простое 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 () я попытался изменить имя метода на случайное, и я получил исключение: «Нет доступного bean-компонента с именем restTemplate».
  4. Интерфейс CommandLineRunner реализован с помощью лямбда-выражения. Доступ к commandLineRunner вызывает исключение.

Вопрос

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

1 Ответ

0 голосов
/ 30 августа 2018

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

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

При создании экземпляра RestTemplate с помощью метода restTemplate () Я попытался изменить название метода на случайный, и я получил исключение, что «недоступен бин с именем restTemplate».

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

ctx.getBean("restTemplate")

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

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

...