在 Spring / Spring Boot(你用的是 Boot 3.x) 里,这两个是非常核心、但很容易混淆的扩展点。 一句话先给你结论:
BeanFactoryPostProcessor:改“Bean 的定义”BeanPostProcessor:改“Bean 的实例”
下面我按 执行时机 → 能干什么 → 典型用途 → 对比表 → 面试/实战易错点 给你讲清楚。
一、核心区别(先记住这张脑图)
| 对比点 | BeanFactoryPostProcessor | BeanPostProcessor |
|---|---|---|
| 作用对象 | BeanDefinition(还没创建 Bean) | Bean 实例(已经创建) |
| 执行时机 | Bean 实例化之前 | Bean 实例化之后 |
| 能不能拿到 Bean 对象 | ❌ 不行 | ✅ 可以 |
| 能不能改属性值 | 改定义 | 改实例 |
| 常见用途 | 动态注册 / 修改 Bean | AOP / 代理 / 注入增强 |
| 是否影响容器结构 | ✅ 会 | ❌ 不会 |
二、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 ← 常用于 AOP2️⃣ 能干什么?
✔ 拿到 真实 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”