Spring容器组件添加的五驾马车
这段时间也陆续给大家带来了一些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和其他不是一个维度,但是我却刻意把它放到了中间。这样可以起到鲜明对比的效果,加深对原理的理解。
文章转载自公众号:编程一生