Spring扩展点:BeanFactoryPostProcessor
Spring的设计非常优雅,有很多的扩展点供我们对项目进行扩展,今天学习一下Spring其中之一扩展点———BeanFactoryPostProcessor
BeanFactoryPostProcessor
即:BeanFactory后置处理器
,是实现Spring容器功能扩展的又一重要接口。它是对 BeanDefinition
对象进行属性相关的修改。
例如:
修改bean属性值
,实现bean动态代理
等。很多框架都是通过此接口实现对spring容器的扩展,例如mybatis与spring集成时,只定义了mapper接口,无实现类,但spring却可以完成自动注入,是不是很神奇? 本文将通过简单的例子,展现BeanFactoryPostProcessor的扩展能力。
说明:BeanDefinition对象,即:Bean定义对象,里面存储着Bean标签的所有信息,Spring就是通过BeanDefintion对象来生成最终的Bean实例。
执行时机
所有的bean定义信息,已经被加载到IOC容器中,bean实例还没有被初始化时,BeanFactoryPostProcessor被调用。
即:在bean定义已解决被加载到IOC容器中,还没有初始化之前,我们可以悄悄的往容器中添加一些东西,进行一些小动作的修改。
使用
/** * TODO 自定义BeanFactoryPostProcessor * 执行时间:所有的Bean定义信息已经加载到容器中,但是Bean实例还没有被初始化. * * @author : lzb * @date: 2021-03-15 17:42 */
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("IOC 容器调用了MyBeanFactoryPostProcessor中重写的postProcessBeanFactory方法");
for(String name:beanFactory.getBeanDefinitionNames()) {
if("person".equals(name)) {
System.out.println("将Person对象设置为懒加载");
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name);
beanDefinition.setLazyInit(true);
}
}
}
}
使其生效,有如下两种方式:
方式一:使用
@Configuration + @Bean
方式初始化
/** * 定义一个主配置类,标识为@Configuration,通过@Bean方式初始化,注入IOC容器 */
@Configuration
public class MainConfig {
@Bean
public MyBeanFactoryPostProcessor myBeanFactoryPostProcessor () {
return new MyBeanFactoryPostProcessor();
}
}
方式二:使用
@ComponentScan + @Component
方式初始化
/** * 使用@ComponentScan定义组件扫描包范围,在可扫描的保范围内, * 然后使用@Component方式,将其定义为一个组件初始化,注入IOC容器 */
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("IOC 容器调用了MyBeanFactoryPostProcessor中重写的postProcessBeanFactory方法");
// 获取Bean定义名称,进行遍历
for(String name:beanFactory.getBeanDefinitionNames()) {
// 如果是person对象
if("person".equals(name)) {
System.out.println("将Person对象设置为懒加载");
// 获取person的BeanDefinition(Bean定义对象)
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name);
// 将Person对象设置为懒加载
beanDefinition.setLazyInit(true);
}
}
}
}
还没有评论,来说两句吧...