Spring5应用之BeanPostProcessor

作者简介 :☕️大家好,我是Aomsir,一个爱折腾的开发者!
个人主页Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏
当前专栏Spring5应用专栏_Aomsir的博客

前言

BeanPostProcessor在中文中可以翻译为"Bean后置处理器 ",它用于对Spring框架创建的对象进行后续处理或加工

BeanPostProcessor是Spring框架中的一个高级特性 ,它在Spring的底层实现中起到了关键作用。很多高级功能的封装都离不开这项技术。当我们后续深入探讨**AOP(面向切面编程)**时,会对其进行更深入的分析

在Spring中,Bean的创建包括调用构造方法属性注入执行BeanPostProcessor的前置处理调用InitializingBean和自定义初始化方法,再经过BeanPostProcessor的后置处理后得到最终Bean实例

在Spring中,BeanPostProcessor的before/after方法接收bean实例和beanName作为参数,并在加工后返回该bean,最终交由Spring容器进行管理

在实战中,我们很少通过InitializingBean或属性设置进行初始化,而更多地是通过BeanPostProcessor来完成。因此,很多时候我们并不需要明确区分其before和after方法

开发步骤

  • 创建Bean对应的类
  • 实现 BeanPostProcessor接口
  • Spring的配置文件中进行配置
  • 编写测试方法
  • 测试结果如下
    • name属性的值由Aomsir变为了Aomsir1
java 复制代码
@Data
public class Category {
    private Integer id;
    private String name;
}
java 复制代码
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 不处理,但是需要返回
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

        if (bean instanceof Category) {
            Category category = (Category) bean;
            category.setName("Aomsir1");
        }
        return bean;
    }
}
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="category" class="com.aomsir.basic.beanpost.Category">
        <property name="id" value="1" />
        <property name="name" value="Aomsir" />
    </bean>

    <bean id="myBeanPostProcessor" class="com.aomsir.basic.beanpost.MyBeanPostProcessor" />
</beans>
java 复制代码
public class TestSpring {
    @Test
    public void test13() {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        Category category = ctx.getBean("category", Category.class);
        System.out.println("category = " + category);
    }
}

注意

BeanPostProcessor会对Spring工厂中的所有Bean进行处理。因此,在实现BeanPostProcessor接口的类中,我们需要对不同的Bean进行区分处理,以避免潜在的问题

参考文献

相关推荐
用户5944041035617 分钟前
Go 语言高性能 Web 服务开发:基于 Gin + GORM + Redis 构建 RESTful API
后端
Python私教19 分钟前
App 第一版该砍什么?用三问法守住 MVP 的工程底线
后端·mvp
ServBay26 分钟前
AI 工程师必备的 9 个 Python 库,从数据验证到模型优化
后端·python·ai编程
Python私教28 分钟前
软件开发报价差 3 倍,真正的工程冲突不在价格
后端·架构
kisshyshy38 分钟前
掘金同款社区数据库设计:9张表带你吃透建表、索引与约束
后端·sql·markdown
元界metalite43 分钟前
SpringBoot项目Maven-BOM统一版本就不会冲突吗
后端
蓝宝石Kaze1 小时前
Gin 框架快速上手
后端
TechLee1 小时前
跨语言加解密总对不上?这个纯 Go 神库让 AES/RSA 与 PHP、Java 100% 互通
java·后端·算法
用户594404103561 小时前
从零手写轻量级 RPC 框架:基于 Netty + Zookeeper 的核心实现
后端
FEF前端团队2 小时前
小程序微信支付 V3 接入实战手册:从商户配置到前后端落地
javascript·后端·node.js