了解实例变量名称和使用 Spring @Bean 注释创建它的方法

Understanding the instance variable names and the methods to create it using Spring @Bean annotation

我已经编写了一个简单的 Spring 启动应用程序,稍后我将对其进行扩展以构建一个 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 实例时,我尝试将方法的名称更改为随机名称,但出现异常 "No bean named 'restTemplate' available".
  4. CommandLineRunner 接口是通过lambda 表达式实现的。访问 commandLineRunner 会引发异常。

问题

为什么我会看到第 2 点和第 3 点中提到的结果?

While creating a RestTemplate instance through restTemplate() method, I tried changing the name of the argument to builder. It works.

这是有效的,因为默认情况下 spring 自动装配是按类型的。所以它搜索类型为 RestTemplateBuilder 的 bean 并找到它,因此没有错误。

While creating a RestTemplate instance through restTemplate() method, I tried changing the name of the method to a random one and I get an exception that "No bean named 'restTemplate' available".

您遇到异常不是因为您更改了方法名称,而是因为这个

ctx.getBean("restTemplate")

因为默认情况下 @Bean 使用方法名称作为 bean 的名称。 (check this)。因此,您的随机方法返回的 RestTemplate 类型的 bean 的名称就是您的随机方法的名称。因此,当您尝试获取名称为 restTemplate 的 bean 时,它会抛出异常。

但是,如果您要自动装配 RestTemplate 类型的 bean,它仍然可以工作,因为 Spring 默认情况下将按类型自动装配,并且它知道 RestTemplate 类型的 bean(名称为随机方法名称)。