@Autowired自动装配

@Autowired自动装配!!!
在不使用xml配置文件时,@Autowired是我们使用最多的注解之一,关于该注解的原理如下:
@Autowired原理:在启动springIoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。
在使用@Autowired时,首先在容器中查询对应类型的bean
    如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据(byType)
    如果查询的结果不止一个,那么@Autowired会根据名(byName)称来查找。
    如果查询的结果为空,那么会抛出异常。解决方法时,使用@Autowired(required=false)
而关于@Autowired的用法,我总结了一下三点:

1.用在字段上
@Autowired用在字段上时,表示Spring会对改字段进行匹配赋值,在Spring容器中查找(byType),找到能匹配到该字段的对象,然后进行赋值;如果未找到就爆出异常,可以指定required=false允许字段值为null解决报错。

2.用在set方法上
@Autowired用在字段上时,会找到改set方法对应的字段,然后其过程与其一致。

3.用在构造方法上
@Autowired用在构造方法上时,会找到改构造方法对应的所有字段,然后其过程与字段一致。

4. byName or byType?
我们在进行项目开发时,会经常写这样的代码:

@Autowired
private Service service;

值得注意的是,Service 普遍写法是一个接口,而@Autowired进行属性赋值时必定是该接口的实现类,但我们不能保证该接口只有一个实现类,也就是说@Autowired自动注入到底是哪一个实现类?
下面是关于byName or byType的解释:

byName:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。
byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生,也可以通过设置

由此可见,@Autowired默认使用的是byType类型,但是对于多个实现类的情况下,@Autowired又支持再次通过byName进行识别,也就是说:

@Autowired
private Service service1;
@Autowired
private Service service2;

注入的是不同的两个实现类,当然前提是他们都实现了共同的接口Service
除此之外,我们还可以通过@Qualified注解来指定实现类,以此规避多个实现类的情况。
代码如下:

@Autowired
@Qualified("service1")
private Service service;
//当然,一个类中不能存在同名的成员属性
@Autowired
@Qualified("service2")
private Service service;
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值