一、在构造函数上定义

关于在构造方法上加@Autowired注解,讲下面几点:
1.带有@Autowired注解(属性required默认为true)的构造方法,在Spring初始化对象实例时,会调用此构造函数,进行对象的实例化。
2.如果构造方法上带有了@Autowired注解,那么这个构造方法不是public修饰的,也可以被实例化。private修饰的,也可以被实例化出来。
3.当一个对象只有一个构造方法时,Spring实例化对象会默认选择这个构造方法进行实例化,无需加@Autowired注解。只有当多个构造方法存在时,才用加@Autowired注解,告诉Spring选择哪个构造方法进行实例化。
4.构造方法的@Autowired且required属性为true只允许存在一个。其他的@Autowired直接的required属性必须设置为false。
5.实例化带参数的构造方法时,Spring会先实例化构造方法中参数对象。

总结:当一个类中有多个构造方法,且我们要选择某一个构造方法进行Spring实例化时,可以在构造方法上加@Autowired注解。

二、在类属性上定义

这种用法是我们最常用的。字段在构造bean之后,在调用任何配置方法之前被注入。这样的配置字段不必是public的。private的也可以被赋值。

三、在方法上定义

定义在其他方法上,当Spring容器调用该类的构造方法实例化完成该类后,会调用@Autowired修饰的方法,并将方法的参数进行实例化。也就是说,我们如果想实例化完成一个类后,执行某个方法时,可以用@Autowired注解来修饰。Spring会自动给我们执行该方法,有点儿类似于init-method的用法。但是必须保证该方法的参数对象在Spring容器中也存在,否则会报错。

四、注意

  1. 在BeanPostProcessor类和BeanFactoryPostProcessor类中无法使用@Autowired注解。因为@Autowired注解的收集工作就是由BeanPostProcessor类来完成的,且BeanFactoryPostProcessor类的调用时机先于BeanPostProcessor类。所以这两个类无法使用@Autowired注解。
  2. @Autowired修饰方法时,如果方法的参数传入的是array,Collection或者Map类型的参数,那么Spring在自动注入这些参数时,Spring容器会把集合定义的泛型的所有实例化对象,放入集合中。所以,在这种情况下使用Map作为参数时,map的key必须为String类型,Spring会根据map的value值的对象类型,去实例化对象,最终map的key是value所对应对象类型的beanNames,value就是实例化的对象。