@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 注入的那个对象,也是调用的无参的构造函数。

原因如下:

@Autowired

private 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

回到顶部