Spring 实操 : PostProcessor 流程及能做什么

您所在的位置:网站首页 post-process Spring 实操 : PostProcessor 流程及能做什么

Spring 实操 : PostProcessor 流程及能做什么

2024-02-01 14:03| 来源: 网络整理| 查看: 265

首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜 文章合集 : 🎁 juejin.cn/post/694164… Github : 👉 github.com/black-ant CASE 备份 : 👉 gitee.com/antblack/ca…

一 . 前言

BeanPostProcessor 是 Spring 的核心组件之一 , Bean 实现 BeanPostProcessor 可以实现很多复杂的功能

二 . PostProcessor 的结构 2.1 接口方法

该接口中主要提供了2种 , 其中提供了前置调用和后置调用 . 还可以看到 , 这里通过 default 修饰 , 所以并不是强制重写的

public interface BeanPostProcessor { default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } } 2.2 常见实现类

这里可以看到 , AOP , 定时 , 配置等都实现了相关的集成

system-BeanPostProcessor.png

三 . Spring 源码深入分析 3.1 使用案例

这一部分来看一下 Spring 内部是如何使用 PostProcessor 特性的 , 这一部分以 ScheduledAnnotationBeanPostProcessor 为例.

@Override public Object postProcessBeforeInitialization(Object bean, String beanName) { // 可以看到 , 前置处理并没有太多处理 , 直接返回 return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) { if (bean instanceof AopInfrastructureBean || bean instanceof TaskScheduler || bean instanceof ScheduledExecutorService) { // Ignore AOP infrastructure such as scoped proxies. return bean; } // Step 1 : 开始特殊处理 Class targetClass = AopProxyUtils.ultimateTargetClass(bean); if (!this.nonAnnotatedClasses.contains(targetClass) && AnnotationUtils.isCandidateClass(targetClass, Arrays.asList(Scheduled.class, Schedules.class))) { // Step 2 : 获取 Method 对应 Scheduled 的集合 Map annotatedMethods = MethodIntrospector.selectMethods(targetClass, (MethodIntrospector.MetadataLookup) method -> { Set scheduledAnnotations = AnnotatedElementUtils.getMergedRepeatableAnnotations( method, Scheduled.class, Schedules.class); return (!scheduledAnnotations.isEmpty() ? scheduledAnnotations : null); }); if (annotatedMethods.isEmpty()) { this.nonAnnotatedClasses.add(targetClass); } else { // Step 3 : 方法不为空 , 执行 Process annotatedMethods.forEach((method, scheduledAnnotations) -> scheduledAnnotations.forEach(scheduled -> processScheduled(scheduled, method, bean))); } } return bean; }

PS : 后面就不看了 , 主要就是通过一个 ScheduledTask 运行 Runable 对象

从具体的使用上 , 不难看出 , 他是在创建Bean的时候去做补充的操作 , 那么下面来看一下具体的处理流程

这个流程在Bean 初始化流程 中进行了全面的跟踪 , 这里更关注其中的一些细节

3.2 Before/After 调用流程

入口一 : AbstractAutowireCapableBeanFactory # initializeBean 调用

applyBeanPostProcessorsBeforeInitialization applyBeanPostProcessorsAfterInitialization 其中流程也比较简单 , for 循环所有的 BeanPostProcessors 进行处理 3.3 BeanPostProcessors 的管理 // 在 AbstractBeanFactory 中有一个集合用于管理 BeanPostProcessor private final List beanPostProcessors = new BeanPostProcessorCacheAwareList(); // 不论是哪种类型 ,都会通过以下2种方式进行调用 , 先删除, 后添加 public void addBeanPostProcessors(Collection


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3