spring注入注解@Resource和@Autowired
一、@Autowired和@Qualifier
@Autowired是自动注入的注解,写在属性、方法、构造方法上,会按照类型自动装配属性或参数。该注解,可以自动装配接口的实现类,但前提是spring容器中只有一个实现类的bean,多个bean会报错。同样,自动装配其他类型时也一样。
但同样的类型的bean有多个实例或同样的接口有多个实现类的bean,可以使用@Qualifier指定bean名称,指定bean名称后,就会按照bean的名称匹配。
- 写在属性上,会自动注入bean到属性里。
- 写在方法或构造方法上,会将自动注入bean到参数里。
另外,@AutoWired无法对String、int等常量数据注入。
装配规则:
当添加@Qualifier时,按照bean的名称匹配。
当只写@Autowired时,按照类型自动装配,若同时有多个或一个都不满足,会报错。
1、写在属性上
@Autowired默认按照类型注入,匹配属性类型,也可使用@Qualifier指定bean名称,使用bean名称装配。
@Autowired @Qualifier("userServiceImpl") private UserService userService;
2、写在方法上
@Component("testSon") public class Son { int num = 99; } @Autowired public Father(@Qualifier("testSon") Son son) { this.son = son; }
二、@Resource
@Resource并非spring中的注解,而是tomcat内的javax.annotation包下的注解。
该注解可以写在属性上或方法上,实现自动注入。不能写在构造方法上。
装配规则:
当只写注解,默认按属性名查找beanid,查到则直接装配,若spring容器中没有该beanid,则继续安装属性类型匹配,若只有一个匹配,则装配;若同时满足多个则报错。
当使用了name参数,则只按照name值匹配beanid,没有满足条件,会报错。
1、@Resource默认安照属性名注入,可使用name和type属性指定bean名称和类型
@Resource(name="testSon")
Son son;
2、写在set方法上
@Resource(name="testSon") public void setSon(Son son) { this.son = son; }