了解实例变量名称和使用 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"); }
}
}
观察:
- 实例变量名遵循驼峰命名法,如
预期的。所以,restTemplate 和 restTemplateBuilder 可以工作。
- 在通过 restTemplate() 方法创建 RestTemplate 实例时,我尝试将参数的名称更改为 builder。有效。
- 在通过 restTemplate() 方法创建 RestTemplate 实例时,我尝试将方法的名称更改为随机名称,但出现异常 "No bean named 'restTemplate' available".
- 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(名称为随机方法名称)。
我已经编写了一个简单的 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"); }
}
}
观察:
- 实例变量名遵循驼峰命名法,如 预期的。所以,restTemplate 和 restTemplateBuilder 可以工作。
- 在通过 restTemplate() 方法创建 RestTemplate 实例时,我尝试将参数的名称更改为 builder。有效。
- 在通过 restTemplate() 方法创建 RestTemplate 实例时,我尝试将方法的名称更改为随机名称,但出现异常 "No bean named 'restTemplate' available".
- 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(名称为随机方法名称)。