spring有5种方式完成自动装配Bean
- byName:把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中。如果没有,则不进行装配;
- byType:把与Bean的属性具有相同类型的其它Bean自动装配到Bean的对应属性中。如果没有,则不进行装配;
- constructor:将要注入的bean写在构造函数的参数中,也是byType方式;
- no:缺省情况下,自动配置是通过“ref”属性手动设定
- 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再按类型class装配和变量名无关了,之和变量名前面的类型有关,可写在成员属性上,也可写在方法上
@Resource
private ItemService itemService;
2.可指定name属性,一般不用指定name属性,如果一旦指定name属性,如果按名称找不到,就不会再按类型装配了,所以不要写name好
@Resource(name="类名")
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,终于搞明白它俩的区别了,虽然时间长点,但通过各种尝试,这两个东东算是弄明白了