@Autowired如何知道该注入哪个构造函数的对象?

有这样一段java代码:

// 
@Bean
public RestTemplate getRestTemplate(){
    return new RestTemplate();
}
//controlller 中使用
@Autowired
private RestTemplate restTemplate;

这样很简单的注入了一个无构造参数的bean对象够控制器使用。
但是我在想 当一个对象有多个不同参数的构造方法时 使用@Autowired 如何知道该使用那个构造方法来实例化这个对象?

阅读 2.1k
4 个回答

如果只有一个构造方法,自动调用
如果有多个,需要指定(加注解/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() ,所以调用那个无参的构造函数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题