Skip to content

Spring / Spring Boot(你用的是 Boot 3.x) 里,这两个是非常核心、但很容易混淆的扩展点。 一句话先给你结论:

BeanFactoryPostProcessor:改“Bean 的定义”BeanPostProcessor:改“Bean 的实例”

下面我按 执行时机 → 能干什么 → 典型用途 → 对比表 → 面试/实战易错点 给你讲清楚。


一、核心区别(先记住这张脑图)

对比点BeanFactoryPostProcessorBeanPostProcessor
作用对象BeanDefinition(还没创建 Bean)Bean 实例(已经创建)
执行时机Bean 实例化之前Bean 实例化之后
能不能拿到 Bean 对象❌ 不行✅ 可以
能不能改属性值定义实例
常见用途动态注册 / 修改 BeanAOP / 代理 / 注入增强
是否影响容器结构✅ 会❌ 不会

二、BeanFactoryPostProcessor(工厂级,改“设计图”)

1️⃣ 执行时机

text
加载 BeanDefinition

BeanFactoryPostProcessor  ← 你在这里

实例化 Bean

👉 Bean 还没 new 出来,只是“设计图(BeanDefinition)”


2️⃣ 能干什么?

✔ 修改 Bean 的定义信息:

  • Bean 的 class
  • scope(singleton / prototype)
  • propertyValues
  • lazy-init
  • 是否 primary

✔ 动态注册 Bean

不能做的事:

  • 不能 @Autowired Bean
  • 不能调用 Bean 的方法

3️⃣ 示例

修改 Bean 定义

java
@Component
public class MyBeanFactoryPostProcessor
        implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(
            ConfigurableListableBeanFactory beanFactory) {

        BeanDefinition bd =
                beanFactory.getBeanDefinition("userService");

        bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);
    }
}

4️⃣ 典型使用场景

✔ Spring 内部大量使用 ✔ 框架开发必用

常见实现:

  • PropertySourcesPlaceholderConfigurer
  • ConfigurationClassPostProcessor
  • MyBatis 的 MapperScannerConfigurer

👉 MyBatis 能扫描 Mapper 接口,就是靠它


三、BeanPostProcessor(实例级,改“成品对象”)

1️⃣ 执行时机

text
实例化 Bean

填充属性

postProcessBeforeInitialization

初始化方法(@PostConstruct / afterPropertiesSet)

postProcessAfterInitialization  ← 常用于 AOP

2️⃣ 能干什么?

✔ 拿到 真实 Bean 对象 ✔ 包装代理对象 ✔ 注入额外逻辑 ✔ 改属性值

不能

  • 不能影响 BeanDefinition
  • 不能新增 Bean 定义

3️⃣ 示例

java
@Component
public class MyBeanPostProcessor
        implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(
            Object bean, String beanName) {

        if (bean instanceof UserService) {
            System.out.println("初始化前:" + beanName);
        }
        return bean;
    }

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

        if (bean instanceof UserService) {
            // 这里可以返回代理对象
        }
        return bean;
    }
}

4️⃣ 典型使用场景

✔ AOP ✔ 自动注入 ✔ 生命周期增强

Spring 内部代表:

  • AutowiredAnnotationBeanPostProcessor
  • CommonAnnotationBeanPostProcessor
  • AbstractAutoProxyCreator(AOP)

👉 @Autowired、@Resource、@Transactional 全靠它


四、生命周期顺序(非常重要)

text
1️⃣ BeanDefinition 加载
2️⃣ BeanFactoryPostProcessor
3️⃣ Bean 实例化
4️⃣ BeanPostProcessor.before
5️⃣ 初始化方法
6️⃣ BeanPostProcessor.after
7️⃣ Bean 可用

口诀:

先工厂,后实例 先设计图,后成品


五、面试 & 实战高频易错点

❌ 错误 1:在 BeanFactoryPostProcessor 里 @Autowired

java
@Autowired
private UserService userService; // ❌ null

原因: Bean 还没创建!


❌ 错误 2:想用 BeanPostProcessor 改 scope

java
bean.setScope("prototype"); // ❌ 没用

scope 只能在 BeanDefinition 阶段


❌ 错误 3:分不清 AOP 属于谁

AOP = BeanPostProcessor

因为代理的是 Bean 实例


六、一句话终极总结(你可以直接背)

BeanFactoryPostProcessor:我改的是 Spring 怎么“造 Bean”BeanPostProcessor:我改的是 Spring “造出来的 Bean”