@Autowired如何知道该注入哪个构造函数的对象?
有这样一段java代码:
// @Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
//controlller 中使用@Autowired
private RestTemplate restTemplate;
这样很简单的注入了一个无构造参数的bean对象够控制器使用。
但是我在想 当一个对象有多个不同参数的构造方法时 使用@Autowired
如何知道该使用那个构造方法来实例化这个对象?
回答:
如果只有一个构造方法,自动调用
如果有多个,需要指定(加注解/xml配置等等)
回答:
1:这种Bean一般是单例,自动按照类型注入
2:如果是多实现,这就要指定BeanName
回答:
指定bean的名称:
@Bean(name="xxx")
注入bean:
@Autowired@Qualifier("xxx")
private RestTemplate restTemplate;
回答:
就你当前的代码,并不存在你担心的情况。即使RestTemplate
还存在有参数的构造函数,上述代码使用 @Autowired
注入的那个对象,也是调用的无参的构造函数。
原因如下:
@Autowiredprivate RestTemplate restTemplate;
上述代码会使Spring去找一个类型(实现了) RestTemplate 的 Bean.
而这个 类型(实现了) RestTemplate 的 Bean 之所以能被找到,是由于你的下述代码:
@Bean // 当其它的类需要 RestTemplate 时,使用本方法的返回值public RestTemplate getRestTemplate(){
// 此代码决定了,只要使用 @Autowired 注入,则注入的对象必然为下述代码提供的返回值
return new RestTemplate();
}
综上,由于你的 @Bean
注解到了方法上,然后在这个方法上调用的代码是 return new RestTemplate()
, 所以在 @Autowired
时,会自动调用这个方法一次,在调用时执行了这个无参的构造函数 RestTemplate()
。此时,无论你的 RestTemplate
存在多少有参的构造函数,最终只会执行 new RestTemplate()
,所以调用那个无参的构造函数。
以上是 @Autowired如何知道该注入哪个构造函数的对象? 的全部内容, 来源链接: utcz.com/p/944666.html