Spring容器组件添加的五驾马车

这段时间也陆续给大家带来了一些Spring系列相关的文章。可以从《Spring源码的学习方法和知识地图》入手,看看自己处于哪个阶段,更关注哪些方面。再进行系统性的学习。

今天咱们从另外一个角度对Spring容器的组件注入做一个总结性的学习。

Spring容器组件添加有五驾马车,本文主要以注解驱动做讲解,配置文件注入原理也是一样的:

  1. 包扫描+组件标注注解

  2. 包扫描+@Bean

  3. @Import

  4. 包扫描+FacotoryBean

  5. 包扫描+BeanFactoryPostProcessor

下面对这五驾马车做分别解释。

包扫描+组件标注注解

在《手撕spring核心源码,彻底搞懂spring流程》里,对于包扫描+组件标注注解方式我做过原理的代码手撕。总结来说:

使用@ComponentScan注解标注扫描范围后

af32ad5d4ee924ab9a12dfc7dca56d54.png

@Component

@Service

@Respository

@Controller

标注的类都能被扫描到,添加称为BeanDefinition,最终成为一个Bean。为什么这4个有一样的作用呢?咱们找个代表

f00654981821196a4bbed967696ceee9.png

@Respository定义里明明白白的说明了@Respository就是@Component的别名。就是说这四个注解作用是一样的。只是我妈管我叫静静,我同事管我叫晓静,咱们很多朋友都管我叫静姐。都是指的我一个人。名字不同也是和生活中一样,场合不同。4个名字对应着咱们平时开发时的分层结构。

包扫描+@Bean

e682d0f4a5d234082b9797fd96618477.png

@Bean方式注册的Bean和组件标注注解方式注册的Bean并没有什么不同。但是@Bean功能更加强大。

组件标注注解方式只能加在自己写的类上,第三方包里的类由于都打包好了代码改不了,可以用@Bean的方式引入。同时,@Bean里也能进行初始化赋值等操作,这些是组件标注注解方式做不了的。

@Import

@Import用于快速给容器导入一个包。它讲道理不是和组件标注注解方式、@Bean方式在一个维度。它和包扫描,也就是@ComponentScan是一个维度。

1cb7c949a11e477ea4581406fdc305f2.png

直接@Import可以代替扫描。当然参数可以传入多个,甚至可以传一个带  @ImportSelector 注解的,进行自定义控制。

34699742d170718b986d246c11207a50.png

FacotoryBean

f84a575da38c5825912a8bd300be9332.png

看上面这个代码用了@Component注解,同时实现了FacotoryBean,现在大家思考一下,Spring扫描装配之后会产生几个Bean呢?

我也不卖关子了,答案是两个。一个是UserFactoryBean,一个是User。用工厂Bean有什么好处呢?答案全在代码里。

看上面的getObject方法,是自己写的。究竟怎么实例化,是用jdk动态代理、cglib这些都是自己说的算。这样的好处是如果User是一个接口,那直接@Component是不行的,但是用FacotoryBean就可以在FacotoryBean里实例化好。

3e3f817f1ea534fe81c7be5c036511e2.png

想获取UserFactoryBean实例只要在前面加一个&就可以。这是在Spring代码里定制的:

84077373a15be8b2bc07b299cfc47cc5.png

BeanFactoryPostProcessor

4915717cfbb063376a65776ddc7898df.png

BeanFactoryPostProcessor在容器实例化任何其他的bean之前读取配置元数据,并有可能修改它。这里就多注册了一个Bean进去。它与BeanPostProcessor有区别。BeanPostProcessor可以在spring容器实例化bean之后,在执行bean的初始化方法前后,添加一些自己的处理逻辑。他们之间的区别没有必要特殊记忆。用的时候看要实现的方法就可以了。不同的接口类拿到的参数不同。能对什么参数做处理就是它们之间的区别了。

总结

本文对Spring容器组件做了总结,可以明显的看出@Import和其他不是一个维度,但是我却刻意把它放到了中间。这样可以起到鲜明对比的效果,加深对原理的理解。

编程一生

因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。

PDCA方法论,检查自己是否错过更新:每周三晚上8点左右,我都会更新文章,如果你没有收到,记得点开【编程一生】公众号找一下(*^▽^*)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值