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

ywz888
发布于 2022-10-9 10:35
浏览
0收藏

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

 

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

 

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

1.包扫描+组件标注注解
2.包扫描+@Bean
3.@Import

4.包扫描+FacotoryBean
5.包扫描+BeanFactoryPostProcessor

 

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

 

包扫描+组件标注注解

 

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

 

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

Spring容器组件添加的五驾马车-鸿蒙开发者社区

 

@Component

@Service

@Respository

@Controller

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

Spring容器组件添加的五驾马车-鸿蒙开发者社区

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

 

包扫描+@Bean

Spring容器组件添加的五驾马车-鸿蒙开发者社区

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

 

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

 

@Import

 

 

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

Spring容器组件添加的五驾马车-鸿蒙开发者社区

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

Spring容器组件添加的五驾马车-鸿蒙开发者社区

FacotoryBean

Spring容器组件添加的五驾马车-鸿蒙开发者社区

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

 

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

 

 

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

Spring容器组件添加的五驾马车-鸿蒙开发者社区

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

Spring容器组件添加的五驾马车-鸿蒙开发者社区

BeanFactoryPostProcessor

Spring容器组件添加的五驾马车-鸿蒙开发者社区

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

 

总结

 

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

 

文章转载自公众号:编程一生

分类
已于2022-10-9 10:35:23修改
收藏
回复
举报
回复
    相关推荐