spring中@Autowired用法

  • Post author:
  • Post category:其他


@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 联用的效果



版权声明:本文为qq_50915088原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。