一、@Autowired
注解@Autowired是Spring对组件自动装配的一种方式。
1、构造函数上定义
(1)、带有@Autowired注解的构造方法,在Spring初始化对象实例时,会被调用进行对象的实例化。
(2)、如果构造方法上带有了@Autowired注解,那么这个构造方法就算不是public修饰的也可以被实例化。
(3)、当一个对象只有一个构造方法时,Spring实例化对象会默认选择这个构造方法进行实例化,无需加@Autowired注解。只有存在了多个构造方法时,才用加@Autowired注解,告诉Spring选择那个构造方法进行实例化。
(4)、构造方法的@Autowired且required属性为true的只允许有一个。其他必须设置为false
(5)、实例化带参数的构造方法时,Spring会优先实例化构造方法中的参数。
2、在类属性上定义
最常用的一种。字段在构造bean之后,在调用任何配置方法之前被注入。这样的配置字段不必是
public的,private也可以被赋值。
3、在方法上定义
定义在其他方法上,当Spring容器调用该类的构造方法实例化完成该类后,会调用@Autowired修
饰的方法,并将方法的参数进行实例化。也就是说,我们如果想实例化完成一个类后,执行某个方
法时,可以用@Autowired注解来修饰。Spring会自动给我们执行该方法,有点儿类似于init-
method的用法。但是必须保证该方法的参数对象在Spring容器中也存在,否则会报错。
注意:
1.如果容器中没有一个可以与之匹配且required属性为true则会报异常
NoSuchBeanDefinitionException
2.如果容器中有多个类型可以与之匹配,则自动切换为按照名称装配
3.如果容器中有多个类型可以与之匹配,则自动切换为按照名称装配,如果名称也没有匹配,则报异常
NoUniqueBeanDefinitionException
二、@Autowired自动装配详解
1、@Autowired自动装配,默认优先按照类型IOC容器中寻找对应的组件
2、如果有多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
3、@Autowired配合@Primary使用,当使用@Autowired自动装配时,默认优先选择被注解@Primary标注的组件
4、@Autowired配合@Qualifier使用,使用注解@Qualifier可以指定需要装配组件的id
5、使用@Autowired自动装配,如果在容器中找不到对应的组件,则会报错
6、如果容器中有多个类型可以与之匹配,则自动切换为按照名称装配,如果名称也没有匹配,则报异常
7、@Autowired属性required,默认为true,如果在容器中找不到对应的组件,则会报错;如果为false,就算在容器中找不到对应的组件,则不装配,不会报错;