@Autowired注解是Spring中非常重要且常见的,接下来就简要的介绍一下它的用法。
@Autowired默认是通过set方法,按照
类型
自动装配JavaBean,set方法可省略不写,它主要是修饰在成员变量上。
默认按类型装配
例如:若要在StudentServiceImp 中注入IStudentDao 的实现类,只需要在StudentServiceImp 中添加@Autowired修饰的IStudentDao 的成员变量即可,注意要结合扫描,否则即使使用了@Autowired注解,在容器中也找不到这个类。
@Autowired默认的是按照类型进行装配注入,例如下面的这段代码:它的含义就是要在spring容器中找到一个IStudentDao类型的类,此时容器中必须要有一个与之匹配的类型,否则就会报
NoSuchBeanDefinitionException
的异常。
public class StudentServiceImp implements IStudentService {
@Autowired
private IStudentDao studentDaoImp1;
}
按名称装配
此时可能会出现这样的问题:spring容器中同时注入了多个同一类型的类时怎么办?
这个时候@Autowired会自动切换成按名称装配,它会根据成员变量的名称去容器中查找对应类型且名称匹配的类。 如果根据名称没有找到匹配的类,那麽就会报
NoUniqueBeanDefinitionException
的异常。
例如,同样是上面那段代码,不同的是IStudentDao接口现在有两个实现类如下,此时按照类型显然是不行的,这是就会切换成按名称装配,它会去容器中找IStudentDao类型的,名称为studentDaoImp1的那个类注入。
@Autowired
private IStudentDao studentDaoImp1;
与@Qualifier 联用,按名称装配
如果在不考虑容器中匹配类型的数量是否唯一的情况下,我就是想按照名称装配怎么办?
这个时候可以和@Qualifier 联用,通过@Qualifier注解中的value属性来指定要注入的那个类。
@Autowired
@Qualifier(value = "studentDaoImp")
private IStudentDao dao;
代码所体现的是:要注入的是IStudentDao 类型的名叫studentDaoImp的类,这个之后在确保它存在的前提下,只会存在一个符合条件的类。
@Resource
@Resource注解等价于@Autowired和@Qualifier 联用的效果,上面那段代码可简化如下,在此就不重复解释了。
// @Autowired
// @Qualifier(value = "studentDaoImp")
@Resource(name = "studentDaoImp")
private IStudentDao dao;
总结
- @Autowired可自动装配javaBean
- @Autowired默认按类型装配,此时必须有且只有一个符合条件的
- 当有多个同一类型时,@Autowired切换成按名称装配
- @Autowired和@Qualifier 联用可指定注入类
- @Resource等价于@Autowired和@Qualifier 联用的效果