介绍

今天聊一聊spring中很重要的两个扩展点BeanPostProcessor和BeanFactoryPostProcessor,spring之所以如次强大,是因为它提供了丰富的功能给我们使用,但是我觉得最强大的是它扩展点,因为有了各种扩展点,我们才能去开发一些自己的需求,一个框架的强大之处也在于它能否灵活的配置,能够支持很好的扩展。

我们基于spring进行业务开发时,无非做的就是编写各种bean,注入各种bean,编写配置类等工作,如果没有一些特殊的需求,我们基本上不用去使用spring的扩展点,spring已有的功能基本能满足我们的需求,但是如果需要深度的开发,比如整合一些中间件,进行一些定制化的开发,那么它本身提供的实现可能就满足不了需求或者不适合,所以这时候就需要我们使用扩展点。

简单是因为有复杂的实现

我们使用spring进行项目开发的时候,可以说,万物皆是bean,我们的工作也是写bean,然后注入bean,传统的MVC架构中,使用spring的话无非就是Controller层注入Service层,Service层注入Dao层,使用的注解无非也就是@Controller@Service@Repository@Component@Autowired等,项目中的配置类会使用@Configuration,然后整个项目就能运行起来,开发效率十分高,如果在没有spring的时候,那么就会变得很复杂,因为有了spring,所以一切都变得简单。

能够简单的使用spring,完全得益于spring的底层设计,不过spring的底层是十分的复杂,我们使用@Component标注类,这个类就会被组装成bean注册进IOC容器中,我们使用@Autowired,它就能注入我们想要的bean,这一切都归功于spring的底层,我们今天主要来说BeanPostProcessor和BeanFactoryPostProcessor。

BeanFactoryPostProcessor

BeanFactoryPostProcessor是bean进行实例化前的扩展点,实例化就是创建对象实例,通俗一点就是new,既然还没有实例化,那么此时的bean就处在定义阶段,在spring中叫做BeanDefinition,也就是bean的定义信息,这些信息来自于我们定义的bean信息,比如通过XML文件定义bean,通过注解定义bean,然后这些信息会被组装进BeanDefinition中,当然我们也可以直接将属性写进BeanDefinition,BeanFactoryPostProcessor阶段就可以对BeanDefinition进行一些配置,比如添加属性,设置bean的作用域,是否懒加载等等,在spring底层用得很多多的ConfigurationClassPostProcessor,它是BeanFactoryPostProcessor的一个实现,它的作用是在spring启动时处理@Configuration标注的类,为后续的操作奠定一个基础,后续的很多bean的注入都是要依赖于它。

总而言之,BeanFactoryPostProcessor阶段的作用就是操作BeanDefinition,注册BeanDefinition,以方便后续bean的实例化,如果我们在使用中需要对Bean的元信息进行进行一些定制化,那么我们就可以实现BeanFactoryPostProcessor。

BeanPostProcessor

在bean的元信息定义完成并添加道BeanFactory中去后,就需要对bean进行实例化,因为只有实例化后的bean才能使用,BeanDefinition是不能被直接使用的,它只是一些元信息,就好比我们要使用数据库的连接池,那么数据库的JDBC连接串,用户名,密码,最大连接数这些就是元信息,但是我查询数据要使用的是连接池中的连接实例,同理,spring中要使用某个组件,那么使用的是它的对象实例,所以就需要进行实例化,那么实例化后,我们可能需要对bean做一些操作,BeanPostProcessor就是对实例化后的bean做一些操作。

BeanPostProcessor有很多实现,比如我们通过@Autowired注入bean时,那么就会用到AutowiredAnnotationBeanPostProcessor,它会对@Autowired标注的字段,setter方法,构造函数进行解析,然后实现注入,如果我们使用@Resource注入Bean时,会用到CommonAnnotationBeanPostProcessor,当我们使用事物时,会用到AnnotationAwareAspectJAutoProxyCreator,这些都是它的实现,从这里可以看出,spring的设计时灵活的,可扩展的,当引入一些新的功能,那么直接去实现相应的扩展就行,这个阶段的bean时实例化后的bean,我们可以进行一些操作,比如检查Bean实例的状态或配置是否正确,并对其进行必要的修正或补充,也可以执行一些初始化方法。

总结

上面我们对BeanFactoryPostProcessor和BeanPostProcessor进行了简单的讲解,BeanFactoryPostProcessor的主要作用就是对BeanDefination进行操作,BeanPostProcessor主要是对实例化后的bean进行操作,spring之所以如此强大,就是因为它的扩展点和丰富的功能才使得它十分复杂,如果没有这些,那么spring其实就是将bean的实例放入一个Map中,仅此而已,但是因为有了这些扩展点,它才成为了最强大的Java开发框架。

今天的分享就到这里,感谢你的观看,我们下期见!

聊聊Spring扩展点BeanPostProcessor和BeanFactoryPostProcessor的更多相关文章

  1. Spring扩展点之Aware接口族

    引言 Spring中提供了各种Aware接口,方便从上下文中获取当前的运行环境,比较常见的几个子接口有:BeanFactoryAware,BeanNameAware,ApplicationContex ...

  2. Spring扩展点-v5.3.9

    Spring 扩展点 **本人博客网站 **IT小神 www.itxiaoshen.com 官网地址****:https://spring.io/projects/spring-framework T ...

  3. Spring扩展点之BeanFactoryPostProcessor

    前言 BeanFactoryPostProcessor接口是Spring中一个非常重要的接口,它的接口定义如下 public interface BeanFactoryPostProcessor { ...

  4. Spring扩展点之BeanPostProcessor

    前言 BeanPostProcessor接口是Spring中一个非常重要的接口,它的接口定义如下 public interface BeanPostProcessor { Object postPro ...

  5. Spring中的BeanPostProcessor和BeanFactoryPostProcessor

    BeanPostProcessor BeanFactoryPostProcessor 标准ioc容器初始化之后的后置处理器 BeanDefintionRegisterPostProcessor 在所有 ...

  6. Spring扩展点之FactoryBean接口

    前言 首先看一下接口定义 public interface FactoryBean<T> { /** * 返回对象实例 */ @Nullable T getObject() throws ...

  7. spring扩展点之PropertyPlaceholderConfigurer

    原理机制讲解 https://leokongwq.github.io/2016/12/28/spring-PropertyPlaceholderConfigurer.html 使用时多个配置讲解 ht ...

  8. Spring Container的扩展点

    转自: http://blog.csdn.net/kkdelta/article/details/5488430 Spring在解析完配置文件后,会调用一些callback方法,使用Spring的开发 ...

  9. Spring-IOC 扩展点 BeanFactoryPostProcessor及其子接口解析

    BeanFactoryPostProcessor 接口的英文描述: Allows for custom modification of an application context's bean de ...

  10. spring扩展点之一:BeanFactoryPostProcessor和BeanPostProcessor

    一.BeanFactoryPostProcessor和BeanPostProcessor的区别 BeanFactoryPostProcessor和BeanPostProcessor都是spring初始 ...

随机推荐

  1. SQL之rand,round,floor,ceiling,cast小数处理函数

    rand():取随机数,select rand() from T 结果:0.635811742495648 round():保留N位小数,四舍五入 select round(1.0446,N) flo ...

  2. SQL Server datetime类型为null的有趣实验

    @data1 --变量 测试用 @data2 --当前时间 当@data1为null 则格式转换错误 直接控制台什么也不显示 也不报错 当定义'' 显示默认时间

  3. C++调用Python_____用Python C API

    项目需要用C++来处理用python处理的数据集,所以就需要在C++中调用python. 先介绍第一种方法,python文档中给出了python c api,可以实现C++与python的互动. 先新 ...

  4. mybatis批量更新的几种方式和性能对比

    https://blog.csdn.net/csdnbeyoung/article/details/106258611

  5. 4组-Alpha冲刺-总结

    组长博客链接 一.基本情况 1.1现场答辩总结 1.1.1柯老师的建议与问题: 界面不够美观,要求达到看不出来是学生作品的水平. 答:好的,我们会进一步改进. alpha完成程度? 答:完成到60%以 ...

  6. JMeter参数化(二)--数据库参数化

    1.下载mysql驱动,解压得到mysql-connector-java-8.0.17.jar(驱动一般放在java的 \java\jre\lib\ext 路径下): 2.在 测试计划-->浏览 ...

  7. java15配置环境后java_version无反应(不显示“不是内部或外部命令”)

    重新装了jdk15来使用eclipse 配置完环境变量之后打开cmd输入 java -version 好家伙,居然一点反映都没有, 然后傻乎乎的跑回去重新配置JAVA_HOME和path 还是没用,细 ...

  8. Matlab %伍

    第五章:初级绘图进阶 Special Plots  loglog semilogx semilogy plotyy hist bar pie polar Logarithm Plots  x = lo ...

  9. Eclipse导入第四版《算法》algs4库

    最近在研究<算法>,遇到algs4库导入eclipse问题,查了很多网站,都不适用,最终解决,特此记录一下.第一次写博客,有什么不足之处望各位大神纠正. 1. 首先打开eclipse软件, ...

  10. unity踩坑集锦

    1.AB包加载,如果项目没有这个tag,那么就匹配不上,和代码一样.2.unity打包安卓topbar想显示出来怎么做?:不渲染安全区域外  3. unity编辑器报错 : Expanding inv ...