BeanFactoryPostProcessor
BeanFactoryPostProcessor在Bean实例化前介入,修改BeanDefinition元数据。
接口定义
Java
@FunctionalInterface
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
执行时机
Java
┌─────────────────────────────────────┐
│ BeanDefinition加载完成 │
├─────────────────────────────────────┤
│ BeanFactoryPostProcessor执行 │
│ (修改BeanDefinition) │
├─────────────────────────────────────┤
│ Bean实例化 │
├─────────────────────────────────────┤
│ BeanPostProcessor执行 │
└─────────────────────────────────────┘
修改属性值
Java
@Component
public class PropertyOverridePostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// 获取BeanDefinition
BeanDefinition bd = beanFactory.getBeanDefinition("dataSource");
// 修改属性值
MutablePropertyValues pvs = bd.getPropertyValues();
pvs.add("url", "jdbc:mysql://prod-db:3306/app");
pvs.add("maxPoolSize", 50);
System.out.println("数据源配置已覆盖");
}
}
动态注册Bean
Java
@Component
public class DynamicBeanRegisterPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
ConfigurableBeanRegistry registry = (ConfigurableBeanRegistry) beanFactory;
// 动态注册BeanDefinition
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setBeanClass(DynamicService.class);
bd.setScope("singleton");
bd.setLazyInit(false);
registry.registerBeanDefinition("dynamicService", bd);
System.out.println("动态Bean注册完成");
}
}
扫描并处理Bean
Java
@Component
public class CustomAnnotationPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// 获取所有Bean名称
String[] beanNames = beanFactory.getBeanNamesForType(Object.class);
for (String beanName : beanNames) {
BeanDefinition bd = beanFactory.getBeanDefinition(beanName);
Class<?> beanClass = beanFactory.getType(beanName);
// 检查自定义注解
if (beanClass != null &&
beanClass.isAnnotationPresent(CustomFeature.class)) {
// 添加AOP代理标记
bd.setAttribute("proxyTargetClass", true);
System.out.println("处理标注CustomFeature的Bean: " + beanName);
}
}
}
}
BeanDefinition操作API
Java
// 获取BeanDefinition
BeanDefinition getBeanDefinition(String beanName);
// 获取所有Bean名称
String[] getBeanNamesForType(Class<?> type);
// 获取Bean类型
Class<?> getType(String beanName);
// 判断是否包含BeanDefinition
boolean containsBeanDefinition(String beanName);
// 获取BeanDefinition数量
int getBeanDefinitionCount();
BeanDefinition常用属性
Java
BeanDefinition bd = beanFactory.getBeanDefinition("myBean");
// 类名
bd.setBeanClassName("com.example.MyService");
// Scope
bd.setScope("singleton"); // 或 "prototype"
// 懒加载
bd.setLazyInit(true);
// 初始化方法
bd.setInitMethodName("init");
// 销毁方法
bd.setDestroyMethodName("destroy");
// 是否Primary
bd.setPrimary(true);
// 属性值
MutablePropertyValues pvs = bd.getPropertyValues();
pvs.add("name", "test");
pvs.add("enabled", true);
// 构造参数
ConstructorArgumentValues cav = bd.getConstructorArgumentValues();
cav.addGenericArgumentValue("default");
PropertyPlaceholderConfigurer
text
@Component
public class CustomPropertyPlaceholder extends PropertyPlaceholderConfigurer {
@Override
protected String resolvePlaceholder(String placeholder, Properties props) {
// 自定义属性解析逻辑
if (placeholder.startsWith("ENV.")) {
return System.getenv(placeholder.substring(4));
}
return super.resolvePlaceholder(placeholder, props);
}
}
// 配置文件使用
<bean class="com.example.CustomPropertyPlaceholder">
<property name="location" value="classpath:config.properties"/>
</bean>
与BeanPostProcessor对比
| 接口 | 执行时机 | 操作对象 | 用途 |
|---|---|---|---|
| BeanFactoryPostProcessor | Bean实例化前 | BeanDefinition | 修改配置、注册定义 |
| BeanPostProcessor | Bean实例化后 | Bean实例 | 修改实例、包装代理 |
要点总结
- BeanFactoryPostProcessor在Bean实例化前执行
- 可修改BeanDefinition属性、添加Bean定义
- 实现容器级扩展,不操作具体Bean实例
- PropertyPlaceholderConfigurer是其典型实现
- 与BeanPostProcessor时机和功能不同
📝 发现内容有误?点击此处直接编辑