SpringMVC中的@Resource、@Autowired和@Qualifier注解的区别和使用。
在其他类中引入bean时,使用@Resource注解并放置在成员变量或者set方法上部即可。例如UserServiceImpl类中要引入id为“userDaoImpl”的Dao层的bean对象,代码如下:
@Service
public class UserServiceImpl implements UserService
{
@Resource
private UserDao userDao;
//忽略其他代码...
}
或者使用@Autowired和@Qualifier注解:
@Service
public class UserServiceImpl implements UserService
{
@Autowired
@Qualifier("userDaoImpl")
private UserDao userDao;
//忽略其他代码...
}
最上面的代码示例使用@Resource注解引入bean配置并注入类中,其实还可以使用@Autowired注解类代替。@Autowired注解是Spring的自动装配注解,可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。而@Resource注解是J2EE基于JSR-250规范的注解(所属包:javax.annotation.Resource),和@Autowired注解一样起到自动装配的作用。两者的区别如下:
(1)@Resource注解与@Autowired注解都可以用来装配bean,都可以写在成员变量上,或写在参数的setter方法上。
(2)@Resource注解默认按名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,name属性一旦指定,只按照名称进行配置。
(3)@Autowired注解默认按照类型装配,在默认情况下要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如@Autowired(required = false)。如果想使用名称装配可以结合使用@Qualifier注解。如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题。
推荐使用:@Resource注解。