分享

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

 编程一生 2022-04-10

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

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

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

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

  2. 包扫描+@Bean

  3. @Import

  4. 包扫描+FacotoryBean

  5. 包扫描+BeanFactoryPostProcessor

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

包扫描+组件标注注解

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

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

@Component

@Service

@Respository

@Controller

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

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

包扫描+@Bean

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

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

@Import

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

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

FacotoryBean

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

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

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

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

BeanFactoryPostProcessor

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

总结

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

编程一生

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多