一:spring提供了4种自动装配策略
1:byName: 把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到 Bean的对应属性中。
2:byType:把与Bean的属性具有相同类型的其他Bean自动装载到Bean的对应属性中。
3:constructor:把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean构造器的对应参数中。
4:autodelect:先使用constructor,如果没有找到载使用byName
二:使用注解自动装配
1:Spring自带的@Autowired注解,默认按byType类型注入,可以用在setter方法,一般方法,构造方法,成员属性
Autowired标注可以放在成员变量上,也可以放在成员变量的set方法上。前者,Spring会直接将UserDao类型的唯一一个bean赋值给userDao这个成员变量;后者,Spring会调用setUserDao方法来将UserDao类型的唯一一个bean装配到userDao这个属性。
Autowired标注具有强契约特征,其所标注的属性或参数必须是可装配的,可以通过@autowired(required=false)不一定需要注入Bean。可以配合使用@Qualifier来明确区分出那一个Bean才是真正需要的。因为@Qualifier意味着把@Autowired的byType类型注入,转为byName
2: @Inject注解:标准的自动装配,默认按byName
与@AutoWired区别:使用@Inject注解所标注的依赖关系必须存在。
3:@Resource注解,默认按byName类型注入:
@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配