Spring注解之@Autowired、@Qualifier、@Resource的使用

本文详细介绍了Spring框架中的@Autowired、@Qualifier、@Resource和@Value注解在依赖注入中的应用,强调了Autowired的自动装配机制,以及Qualifier用于解决多匹配问题和Resource与Autowired的区别,同时提到了Value用于注入基本类型和字符串的特性。
摘要由CSDN通过智能技术生成

前言
@Autowired、@Qualifier、@Resource、@Value四个注解都是用于注入数据的,他们的作用就和在xml配置文件中的bean标签中写一个标签的作用是一样的!本篇中特别要讲解的重心是@Autowired注解

1、先给出一个场景
讲@Autowired注解前先给出一个场景:

dao层代码

@Repository
public class AccountDao {
    public void save() {
        System.out.println("dao数据save成功了....");

    }
}
service层代码

@Service
public class AccountImpl implements AccountService {
    
    private AccountDao accountDao;

    @Override
    public void save() {
        accountDao.save();

    }
}
表现层controller代码:

//模拟一个表现层功能
public class AccountController {
    public static void main(String[] args) {
        //1.获取核心容器对象
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("Applicationcontext.xml");
        //2.根据id获取Bean对象
        AccountService as  = (AccountService)ac.getBean("accountImpl");
        as.save();
        System.out.println(as);
    }
}

2、@Autowired
Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数、参数等进行标注【主要还是用在变量和方法上】,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法,也就是说,使用@Autowired注解注入属性数据不需要这个类提供set方法,方便快捷。@Autowired作用就和在xml配置文件中的bean标签中写一个< property >标签的作用是一样的。

在之前的文章Spring中如何使用工厂模式实现程序解耦?中,我们多多少少知道spring的IOC底层实际上就是一个Map结构容器,所谓key 就是 bean标签 中的 id,value 则是对应 bean标签 中的 class。

@Autowired自动装配首先会在IOC容器中跳过key直接去容器中找到对应的属性!也就是说与key无关。

@Autowired自动装配的三种情况:

1、容器中有唯一的一个bean对象类型和被@Autowired修饰的变量类型匹配,就可以注入成功!
2、容器中没有一个bean对象类型和被@Autowired修饰的变量类型匹配,则注入失败运行报错。
3、容器中有多个bean对象类型和被@Autowired修饰的变量类型匹配,则根据被@Autowired修饰的变量名寻找,找到则注入成功【重点】

很多人会忽略或者不清楚第三点!!!

3、@Qualifier
根据上面@Autowired的第三种情况,需要更改变量名来对应注入,这样就对程序不是很灵活,于是有了@Qualifier这个注解。@Qualifier的作用是在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用(但是在给方法参数注入时可以单独使用),因此@Qualifier注解很受限制,因此用的不是很多。@Qualifier常常组合@Autowired一起使用,用来指明具体名字的自动装配


    @Autowired //如果单纯一个@Autowired 注解则表示找类型为IAccuntDao的,如果有两个类型为IAccuntDao的,则接着匹配类型为IAccuntDao而且名字为accountDao的【缺点:要改变量名指定】
    @Qualifier("accountDao2") //加上这个注解直接找类型为IAccuntDao而且名字为accountDao2的
    private IAccuntDao accountDao;
    
    所以这段代码注解的意思就是直接找类型为IAccuntDao而且名字为accountDao的组件

 @Resource("accountDao2")
 private IAccuntDao accountDao;
4、@Resource
@Resource由J2EE提供,默认是按照byName自动注入(通过名字自动注入),@Resource有两个重要的属性,name和type,当然默认是通过name,这里type属性就没必要讲了,用type属性多此一举,还不如用@Autowired,因此对于@Resource记住通过名字自动注入就好了

5、@Autowired、@Resource的区别
不得不说这两个注解非常相似,而且很容易混淆。

@Autowired、@Resource的主要区别主要有下面几点:

@Autowired    @Resource
注解提供者    Spring    J2EE
自动装配方式    属性    名字
其实主要的区别就这一两点,当然也肯定有着细节,这里就暂时不概述了。

当然比较重要的一点就是:@Resource 相当于 @Autowired + @Qualifier

6、@Value
由于@Autowired、@Qualifier、@Resource三者自动装配只能针对于注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现。因此有了@Value这个注解,@Value专门用来服务基本类型和String类型。

另外@Value注解有一个value 属性:用于指定数据的值。它可以使用spring中SpEL(也就是spring的EL表达式)。SpEL的写法:${表达式},当然也可以类似mybatis中的 #{表达式} 的写法

@Value("#{2*3}")  //#写法 表示
private int age;

@Value("178")    //普遍写法

private int height;

@Value("${man.weight}")  //SpEL的写法一般操作配置文件中数据
private int weight;

7、小结
以上的@Autowired、@Qualifier、@Resource、@Value四个注解都是用于注入数据的,他们的作用就和在xml配置文件中的bean标签中写一个标签的作用是一样的!

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值