Spring注解自动装配

一: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方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配

 

       5.@Resource应用在字段上,则注入规则是:

  a.先使用字段名字匹配bean,查找到bean则注入,如果类型不匹配则此时有异常,注入失败。

  b.如果字段名字没有匹配到Bean则spring会尝试采用字段类型匹配,如果找打bean则注入,如果字段类型是       接口则有可能会匹配到多个类型,则会抛出匹配到多个bean的异常, 注入失败。

       6.@Resource应用在setter上(应用到属性),则注入规则是:

  a.先使用属性名字匹配bean,查找到bean则注入,如果类型不匹配则此时有异常,注入失败。

  b.如果属性名字没有匹配到Bean则spring会尝试采用属性参数类型匹配,如果找打bean则注入,如果属性参数类型是接口则有可能会匹配到多个类型,则会抛出匹配到多个bean的异常.注入失败。 

  注意是属性的参数类型,并不是属性的类型,注意区别

  3.小结

  a.名称------>b.类型或参数类型(属性时). 

 

 

 

你可能感兴趣的:(Spring注解自动装配)