Spring注解开发——39、BeanFactoryPostProcessor

39、扩展原理-BeanFactoryPostProcessor

  • BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的
  • BeanFactoryPostProcessor:beanFactory的后置处理器;
  • 在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容;
  • 所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建

BeanFactoryPostProcessor原理:

  1. ioc容器创建对象
  2. invokeBeanFactoryPostProcessors(beanFactory);
    1. 如何找到所有的BeanFactoryPostProcessor并执行他们的方法;
      1. 直接在BeanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法
      2. 在初始化创建其他组件前面执行

BeanFactoryPostProcessor

在这里插入图片描述

代码测试

package com.suirui.springanno.ext;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;

@Component
public class MyBeanFactoryProcessor implements BeanFactoryPostProcessor {
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("MyBeanFactoryProcessor _____postProcessBeanFactory running");
        int beanDefinitionCount = beanFactory.getBeanDefinitionCount();
        String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println(beanDefinitionName);
        }
        //此处的getBean就是之前那流程,getBean->doGetBean-> getSingleton(第一次尝试拿到bean拿到就包装一下返回)
        //                                          ->getSingleton(第二次lamda表达式创建bean)->createBean->此时bean有两种方式,首先可能的话,返回一个bean的Proxy代理类(resolveBeforeInstantiation,其实是调用了实现了)
        //                                          ->没有Proxy则调用doCreateBean创建bean->populateBean实现bean的创建->initializeBean实现bean的初始化(beforeinitialize,initialize,postinitialize)->完成注册
        MyBeanFactoryProcessor myBeanFactoryProcessor = (MyBeanFactoryProcessor) beanFactory.getBean("myBeanFactoryProcessor");

        myBeanFactoryProcessor.demo();
    }
    public void demo(){
        System.out.println("Demo");
    }
}
package com.suirui.springanno.ext;



import com.suirui.springanno.ext.config.ExtConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainTestExt {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ExtConfig.class);


    }
}

源码分析

创建IOC容器,刷新容器

在这里插入图片描述

invokeBeanFactoryPostProcessors(beanFactory)

在这里插入图片描述

下面我们看一下invokeBeanFactoryPostProcessors(beanFactory)方法里面做了什么操作

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值