Spring扩展点:BeanFactoryPostProcessor

亦凉 2022-11-10 03:47 259阅读 0赞

  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容器中,还没有初始化之前,我们可以悄悄的往容器中添加一些东西,进行一些小动作的修改。

使用

  1. /** * TODO 自定义BeanFactoryPostProcessor * 执行时间:所有的Bean定义信息已经加载到容器中,但是Bean实例还没有被初始化. * * @author : lzb * @date: 2021-03-15 17:42 */
  2. public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
  3. @Override
  4. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
  5. System.out.println("IOC 容器调用了MyBeanFactoryPostProcessor中重写的postProcessBeanFactory方法");
  6. for(String name:beanFactory.getBeanDefinitionNames()) {
  7. if("person".equals(name)) {
  8. System.out.println("将Person对象设置为懒加载");
  9. BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name);
  10. beanDefinition.setLazyInit(true);
  11. }
  12. }
  13. }
  14. }

使其生效,有如下两种方式:

方式一:使用@Configuration + @Bean 方式初始化

  1. /** * 定义一个主配置类,标识为@Configuration,通过@Bean方式初始化,注入IOC容器 */
  2. @Configuration
  3. public class MainConfig {
  4. @Bean
  5. public MyBeanFactoryPostProcessor myBeanFactoryPostProcessor () {
  6. return new MyBeanFactoryPostProcessor();
  7. }
  8. }

方式二:使用@ComponentScan + @Component方式初始化

  1. /** * 使用@ComponentScan定义组件扫描包范围,在可扫描的保范围内, * 然后使用@Component方式,将其定义为一个组件初始化,注入IOC容器 */
  2. @Component
  3. public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
  4. @Override
  5. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
  6. System.out.println("IOC 容器调用了MyBeanFactoryPostProcessor中重写的postProcessBeanFactory方法");
  7. // 获取Bean定义名称,进行遍历
  8. for(String name:beanFactory.getBeanDefinitionNames()) {
  9. // 如果是person对象
  10. if("person".equals(name)) {
  11. System.out.println("将Person对象设置为懒加载");
  12. // 获取person的BeanDefinition(Bean定义对象)
  13. BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name);
  14. // 将Person对象设置为懒加载
  15. beanDefinition.setLazyInit(true);
  16. }
  17. }
  18. }
  19. }

执行结果

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,259人围观)

还没有评论,来说两句吧...

相关阅读