@Autowired 和 @Resource 的区别


spring有5种方式完成自动装配Bean

  1. byName:把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中。如果没有,则不进行装配;
  2. byType:把与Bean的属性具有相同类型的其它Bean自动装配到Bean的对应属性中。如果没有,则不进行装配;
  3. constructor:将要注入的bean写在构造函数的参数中,也是byType方式;
  4. no:缺省情况下,自动配置是通过“ref”属性手动设定
  5. autodetect:首先尝试constructor进行自动装配。如果失败,再尝试使用byType进行自动装配(在spring3。0以后的版本就废弃了,不再合法了);

下面主要讲byType和byName2种方式


@ Autowired

  • 属于spring提供
  • 3种自动装配Bean形式

  1.@Autowired默认按类型byType匹配,自动装配Bean,可写在成员属性上,也可写在方法上

@Autowired
private ItemService itemService;

  2.@Autowired(required=false),默认依赖的对象必须存在,否则报错,如果允许null值,设置required属性为false

@Autowired(required=false)
private ItemService itemService;

  3.按名称装配Bean,与@Autowired组合使用,解决按类型匹配找到多个Bean的问题

@Autowired
@Qualifier("Bean的id名称")
private ItemService itemService;

@Resource

  • JSR-25O提供的,属于Java EE提供
  • 2种自动装配Bean形式

  1.默认按名称byName进行装配,默认使用成员属性的变量名,当找不到匹配的bean再按类型clean装配和变量名无关了,之和变量名前面的类型有关,可写在成员属性上,也可写在方法上

@Resource
private ItemService itemService;

  2.可指定name属性,一般不用指定name属性,如果一旦指定name属性,如果按名称找不到,就不会再按类型装配了,所以不要写name好

@Resource
private ItemService itemService;

【@Autowired和@Resource的区别】

  • 如果配置了class类型一样的多个bean,这时就可采用@Resource的方式注解,因为它是按bean的id查找的,使用@Autowired就不行了,因为是按class类型查找的,但可结合@Qualifier(“Bean的id名称”)使用问题就解决了,否则出现该类型对应多个Bean,spring就不知道注入那个Bean了,就会报如下错误:
    这里写图片描述
  • 减少了与spring的耦合.推荐使用@Resource,但是我看别人编写的代码,大多都是用的@Autowired
  • 按类型转配,是指按变量名前面的变量类型查找Bean,如果有Bean的class类型与之匹配的类型,就能完成装配(并不是将变量名首字母变为大写去找对应的class,一开始本人就是这样认为的,因为我发现代码中使用@Autowired时变量名都是类名首字母变小写);按名称装配,是指变量名和Bean的id属性匹配

【总结】

  • 按类型装配,是指按变量名前面的变量类型查找Bean,如果有Bean的class类型与之匹配的类型,就能完成装配,此种方法,完全可以不用写id属性(并不是将变量名首字母变为大写去找对应的class,一开始本人就是这样认为的,因为我发现代码中使用@Autowired时变量名都是类名首字母变小写)
  • 按名称装配,是指变量名和Bean的id属性匹配,所有的bean都要写class,相当于id名称相当于实例化类的变量名,而类就是class的属性,所以虽说按类型匹配,但是还要写class的,否则报如下错误
  • 这里写图片描述

利用半天的时间,各种试,改id改属性名,去类去id,终于搞明白它俩的区别了,虽然时间长点,但通过各种尝试,这两个东东算是弄明白了

猜你喜欢

转载自blog.csdn.net/wrs120/article/details/80460034