美文网首页Java 核心技术Spring Cloud
Spring扩展接口-BeanFactoryPostProces

Spring扩展接口-BeanFactoryPostProces

作者: 扎Zn了老Fe | 来源:发表于2023-07-01 13:04 被阅读0次

简介

●Spring IOC读取Bean的相关属性,保存到beanDefinition对象中。
● 加载完所有beanDefinition之后,调用BeanFactoryPostProcessor接口扩展点。
● 根据beanDefinition创建bean对象。

如果想获取beanDefinition信息或者修改beanDefinition对象中的属性, 可以实现BeanFactoryPostProcessor进行修改。

示例

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableListableBeanFactory;
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
        beanDefinitionBuilder.addPropertyValue("id", 123);
        beanDefinitionBuilder.addPropertyValue("name", "修改definition");
        defaultListableBeanFactory.removeBeanDefinition("user");
        defaultListableBeanFactory.registerBeanDefinition("user", beanDefinitionBuilder.getBeanDefinition());
    }
}

用途

1.Spring应用读取配置
抽象类:PropertyResourceConfigurer, 主要做的就是读取properties文件,做一些必要的转换,并将这些properties写到bean Definition中。

public abstract class PropertyResourceConfigurer extends PropertiesLoaderSupport
        implements BeanFactoryPostProcessor, PriorityOrdered {

    private int order = Ordered.LOWEST_PRECEDENCE;  // default: same as non-Ordered

    // 略:serOrder / getOrder

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        try {
            Properties mergedProps = mergeProperties();

            // Convert the merged properties, if necessary.
            convertProperties(mergedProps);

            // Let the subclass process the properties.
            processProperties(beanFactory, mergedProps);
        }
        catch (IOException ex) {
            throw new BeanInitializationException("Could not load properties", ex);
        }
    }
}

它有两个实现类:
● PropertyOverrideConfigurer:比如数据库配置为"dataSource.driverClassName=com.mysql.jdbc.Driver",这个类负责将这个value从配置文件中(比如叫datasource.properties)读取配置写到相应的beanDefinition中。
● PropertyPlaceholderConfigurer ,这个类可以将代码中定义的"${...}"替换为配置文件中的实际的值。

2.在Spring启动时打印相关信息, 比如bean的个数,统计指定特性的bean信息。

相关文章

网友评论

    本文标题:Spring扩展接口-BeanFactoryPostProces

    本文链接:https://www.haomeiwen.com/subject/lscxudtx.html