介绍

今天聊一聊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. linux 离线安装jdk

    系统版本:centos7.8 | jdk版本:1.8 jdk版本:jdk-8u5-linux-x64.rpm 点击下载 提取码: ud1r 检查系统是否已经有JDK,输入如下命令查看是否系统中是否已安 ...

  2. HTML5第五章作业

    5.1.3 html 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" ...

  3. NOIP2015普及组

    T1 金币 很简单的题,控制天数这个变量 #include<iostream> #include<cstring> #include<cmath> #include ...

  4. SpringBoot为什么是默认单例的:

    好处: 1)提升性能,减少了新生成实例的消耗 新生成实例消耗包括两方面,第一,spring会通过反射或者cglib来生成bean实例, 其次,给对象分配内存也会涉及复杂算法,这些都是消耗性能的操作. ...

  5. idea的Tomcat的配置

    1.创建一个web项目 2.创建项目完成后,配置   点击add 3.点击扳手  选择tomcat Server ----->Local 4.选择tomcat的文件夹路径  点击ok 5.再次点 ...

  6. centos虚拟机yum update报错Another app is currently holding the yum lock; waiting for it to exit...

    1.运行yum update报错 [root@localhost ~]# yum update已加载插件:fastestmirror, langpacks/var/run/yum.pid 已被锁定,P ...

  7. Asp.Net Core 程序开发技巧汇总

    使用Sqlite数据库 创建项目 Asp.Net Core Web应用程序 Web应用程序 ASP.NET Core 2.2 NuGet管理,添加Sqlite数据库支持 Microsoft.Entit ...

  8. python的setattr可以直接给类设置属性!!!!而不是非要是对象

    dynamic.py import unittest class MakeTestCases: testcases = None def make_test_func(self, case=None) ...

  9. 3---java中的集合

    集合是什么:表示一组元素的对象,有的是有序的,有的是无序的,有的是可重复的,有的是不可重复的. 首先根是:Collection 1:Set 没有重复元素  SortedSet 有序的Set 2:Lis ...

  10. jacoco插件添加

    1.添加依赖 <dependency> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-p ...