都用过@Autowired,但你知道它是怎么实现的吗?

在使用Spring​开发的时候,配置的方式主要有两种,一种是xml​的方式,另外一种是 java config​的方式。在使用的过程中java config​,我们难免会与注解进行各种打交道,其中,我们使用最多的注解应该就是@Autowired​注解了。这个注解的作用就是注入一个定义好的bean。,那么,除了我们常用的属性注入方式之外,还有哪些方式可以使用这个注解呢?在代码层面是如何实现的?,将@Autowired注解应用于构造函数,如以下示例所示:,直接应用于字段是我们使用最多的方式,但是从代码层面使用构造函数注入会更好。因为构造器注入的方式,能够保证注入的依赖不可变,并确保需要的依赖不为空。此外,构造器注入的依赖总是能够在返回客户端(组件)代码的时候保证完全初始化的状态。,此外,还有以下几种不太常用的方法,见下面的代码:,虽然我们经常使用这个注解,但是我们真的了解它的作用吗?,首先从它的作用域来看,其实这个注解是属于容器配置的Spring​注解,其他属于容器配置注解:@Required​, @Primary​, @Qualifier等。,其次,我们可以直接看字面意思,autowire,这个词的意思就是自动装配的意思。,自动装配是什么意思?这个词的本意是指在一些行业中用机器代替人自动完成一些需要装配的任务。在Spring​的世界里,自动组装是指使用我们需要这个bean的class​自动组装Spring​容器中的bean。,所以这个注解作用的就是自动将Spring​容器中的bean​和我们需要这个bean一起使用的类组装起来。,接下来,让我们看看这个注解背后工作的原理。,Java注解实现的核心技术是反射。让我们通过一些例子和自己实现一个注解来了解它的工作原理。,我们拿到target之后就可以用反射给他实现一个逻辑,这种逻辑在这些方法本身的逻辑之外,这让我们想起proxy、aop等知识,我们相当于为这些方法做了一个逻辑增强。,其实注解的实现主要逻辑大概就是这个思路。总结一下一般步骤如下:,下面我们来实现这个逻辑,代码如下:,从上面的实现逻辑不难发现,借助Java反射,我们可以直接获取一个类中的所有方法,然后获取方法上的注解。当然,我们也可以获取字段上的注解。在反射的帮助下,我们几乎可以得到属于一个类的任何东西。这样,我们自己简单做了一个实现。,知道了上面的知识,我们就不难想到,上面的注解虽然简单,但是@Autowired和他最大的区别应该只是注解的实现逻辑,其他的如使用反射获取注解等步骤应该是相同的。,接下来我们看在Spring中,@Autowired是如何实现的呢?,我们来看@Autowired在Spring源码中是如何定义注解的,如下:,阅读代码可以看出,@Autowired注解可以应用于五类构造方法,普通方法、参数、字段、注解,其保留策略是在运行时。,接下来我们看一Spring对这个注解的逻辑实现。,在Spring​源码中,@Autowired​注解位于包中org.springframework.beans.factory.annotation​。经过分析不难发现,Spring对自动装配注解的实现逻辑位于类:AutowiredAnnotationBeanPostProcessor。,核心处理代码如下:,最后,此方法返回一个InjectionMetadata​包含所有autowire注解的集合。,这个类由两部分组成:,一个是我们要处理的目标类,一个是elements上面方法得到的集合。,有了目标类和所有需要注入的元素,我们就可以实现自动装配的依赖注入逻辑。实现方法如下。,它调用的inject​方法就是定义在InjectionMetadata。,上面代码中,方法的参数getResourceToInject​是要注入的名称,bean这个方法的作用是根据名称获取bean。,以上就是@Autowire注解实现逻辑的完整解析。,下面是spring容器实现@Autowired自动注入的时序图。,图片,本文讲解了Spring中最常用的注解之一@Autowired, 平时我们可能都是使用属性注入的,但是后续建议大家慢慢改变习惯,使用构造器注入。同时也讲解了这个注解背后的实现原理,希望对大家有帮助。

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/19063.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34