首页 > 其他分享 >聊聊Spring扩展点BeanPostProcessor和BeanFactoryPostProcessor

聊聊Spring扩展点BeanPostProcessor和BeanFactoryPostProcessor

时间:2023-03-31 10:00:02浏览次数:29  
标签:BeanPostProcessor spring 扩展 BeanFactoryPostProcessor bean 实例 Spring

介绍

今天聊一聊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开发框架。

image

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

标签:BeanPostProcessor,spring,扩展,BeanFactoryPostProcessor,bean,实例,Spring
From: https://www.cnblogs.com/steakliu/p/17275263.html

相关文章

  • Spring-容器启动流程
    1,Spring容器启动三个过程1、初始化Spring容器,注册内置的BeanPostProcessor的BeanDefinition到容器中2、将配置类的BeanDefinition注册到容器中3、调用refresh()方法刷新容器  因为是基于java-config技术分析源码,所以这里的入口是AnnotationConfigApplicationCon......
  • Spring AOP官方文档学习笔记(一)之AOP概述
    1.AOP简介(1)Spring的关键组件之一就是AOP框架,它是对SpringIoC的补充(这意味着如果我们的IOC容器不需要AOP的话就不用引入AOP),此外,AOP亦是对OOP的补充,OOP的关注点在于类,而AOP的关注点在于切面,它可以将分散在不同类不同方法中重复的代码逻辑抽取出来,称之为通知(Advice),然后在运行......
  • 设计模式(三十)----综合应用-自定义Spring框架-自定义Spring IOC-定义bean、注册表相
    现要对下面的配置文件进行解析,并自定义Spring框架的IOC对涉及到的对象进行管理。<?xmlversion="1.0"encoding="UTF-8"?><beans>  <beanid="userService"class="com.itheima.service.impl.UserServiceImpl">    <propertyname=&qu......
  • SpringBoot中如何动态加载类到容器
    任何业务脱离场景无任何实际意义。场景:1,实现了多种存储方式,redis和本地内存或者其它,但是你希望根据注解配置只加载一种类到容器。2,经典场景:mybatis将接口的代理类动态加载到容器。分类:静态加载:1,springboot中会扫描同包路径下的(@configuration@Service@Component)标记了上述......
  • SpringBoot2.7集成Swagger3
    1、引入pom坐标<!--swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>3.0.0</version></dependency><dependency><groupId&......
  • springboot注册Servlet、Filter、Listener的方式
    方式一:注解@WebServlet@WebFilter@WebListener在实现类上使用该注解即可一键注册方式二:配置类在@Configuration标识的配置类中通过RegistrationBean进行注册@Beanp......
  • Spring配置文件和注解
    applicationContext.xml配置文件beans标签里面引入命名空间步骤:复制xmlns然后修改名称为命名空间名字xmlns:名称=“http://www.springframework.org/schema/名称”http:/......
  • Spring-Mybatis整合的所需配置文件
    Spring-Mybatis整合database.properties文件driver=com.mysql.jdbc.Driverurl=jdbc:mysql://127.0.0.1:3306/smbms?useUncode=true&characterEncoding=utf-8uname=rootpa......
  • spring-MVC web.xml springmvc-servlet.xml 配置文件
    springMVC配置文件web.xml<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns......
  • SpringMVC整合的 spring-mvc spring-mybatis配置文件
    SpringMVC入门spring-mvc.xml配置文件<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.......