Понимание имен переменных экземпляра и методов его создания с использованием аннотации 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"); }
}
}
Замечания:
- Имена переменных экземпляра следуют за обозначением верблюжьего случая, как и ожидалось. Итак, restTemplate и restTemplateBuilder работают.
- При создании экземпляра RestTemplate с помощью метода restTemplate() я попытался изменить имя аргумента на builder. Оно работает.
- При создании экземпляра RestTemplate с помощью метода restTemplate() я попытался изменить имя метода на случайное, и я получил исключение: "Нет доступного компонента с именем restTemplate".
- Интерфейс 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 как случайное имя метода).