全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-18 8 分钟 ✍️ juanwangdev

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对比

接口执行时机操作对象用途
BeanFactoryPostProcessorBean实例化前BeanDefinition修改配置、注册定义
BeanPostProcessorBean实例化后Bean实例修改实例、包装代理

要点总结

  • BeanFactoryPostProcessor在Bean实例化前执行
  • 可修改BeanDefinition属性、添加Bean定义
  • 实现容器级扩展,不操作具体Bean实例
  • PropertyPlaceholderConfigurer是其典型实现
  • 与BeanPostProcessor时机和功能不同

📝 发现内容有误?点击此处直接编辑

← 上一篇 BeanFactoryAware
下一篇 → BeanPostProcessor
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库