Spring5.x之@Resource原理

本文目的

1、了解@Resource的作用

2、从源码探讨是如何工作的

3、Spring是如何找到bean哪些属性被@Resource修饰的

4、找到需要注入的属性,那属性值是又如何找到的

5、注解是JDK集成的为什么Spring要支持该注解

准备

老规矩看源码构建教程

说明

首先从@Resource的注释下手

javax.annotation.Resource

The Resource annotation marks a resource that is needed by the application.

资源注释标记应用程序所需的资源

This annotation may be applied to an application component class, or to fields or methods of the component class.

此注释可以应用于应用程序组件类,或者应用于组件类的字段或方法。

When the annotation is applied to a field or method, the container will inject an instance of the requested resource into the application component when the component is initialized.

当注释应用于字段或方法时,容器将在组件初始化时将所请求资源的实例注入应用程序组件。

从类所在位置得知,注解在JDK中,所以随处可用。

从注释得知,该注解可以为组件类的字段和方法,标识是否要进行资源注入

结合上述两点可知,如果只是为了注入在提供Spring一下组件时,可以不需要引用Spring相关依赖,降低项目复杂性。

例子:假设我提供了一个公共jar,但又要引用Spring容器中某个bean,就可以使用该注解进行注入

@Resource的作用

从说明就已经知道,这是jdk包提供给组件,标识资源需要从容器中获取并注入(字段,方法),而Spring容器也遵守该规则,解析@Resource注解并进行实例注入。

从源码探讨是如何工作的

bean初始化完成后进行bean的填充,其中包含了属性、方法填充,org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory

#populateBean

遍历各个BeanPostProcessor进行不同策略的执行,如标记了@Resource的属性就用到了CommonAnnotationBeanPostProcessor,解析bean的所有属性及方法那些加了@Resource收集起来,然后进行值注入,遍历找到的元素org.springframework.beans.factory.annotation.InjectionMetadata,默认名称情况下先从容器中根据名称找,不存在,再根据bean的默认名称到单例池中找找到返回,找不到再找到对应beanDefinition创建实例,如果不存在则报找不到异常;如果指定了自定义名称则跳过从容器找而是进入doCreateBean流程和上面从容器找不到之后的流程一样

Spring是如何找到bean哪些属性被@Resource修饰的

@Resource属性如何找到流程

找到需要注入的属性,那属性值是又如何找到的

@Resource属性值注入值流程

注解是JDK集成的为什么Spring要支持该注解

之所以要引入 ,1、JDK的规范,从@Resource的注释可得知在集成容器时可以兼容该注解来达到引用注入容器中的实例,2、在提供Spring框架的组件时,只需要用到容器中的实例而不需要其他功能时为了减少复杂性不需要引用Spring的Jar包,这时没有@Autowired可以使用@Resource进行注入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值