美文网首页
Spring 源码(五)初始化所有单例Bean,并注册到容器(B

Spring 源码(五)初始化所有单例Bean,并注册到容器(B

作者: xiaolyuh | 来源:发表于2019-09-29 12:50 被阅读0次

    在这之前我们先来看下refresh()方法,它完整的描述了整个ApplicationContext的初始化过程。这里看起来更像是对容器进行初始化的模板或者提纲。

    @Override
    public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            // Prepare this context for refreshing.
            // 初始化容器前的预处理
            prepareRefresh();
    
            // Tell the subclass to refresh the internal bean factory.
            // 告诉子类刷新容器
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    
            // Prepare the bean factory for use in this context.
            // BeanFactory的预准备工作(设置ClassLoader、表达式解析器等)
            prepareBeanFactory(beanFactory);
    
            try {
                // Allows post-processing of the bean factory in context subclasses.
                // 注册BeanFactory的后置处理器
                postProcessBeanFactory(beanFactory);
    
                // Invoke factory processors registered as beans in the context.
                // 执行BeanFactory 的后置处理器(包括解析配置类,加载业务Bean的定义到容器)
                invokeBeanFactoryPostProcessors(beanFactory);
    
                // Register bean processors that intercept bean creation.
                // 注册Bean的后置处理器,在Bean的创建和初始化过程中调用
                registerBeanPostProcessors(beanFactory);
    
                // Initialize message source for this context.
                // 初始化上下文中的消息
                initMessageSource();
    
                // Initialize event multicaster for this context.
                // 初始化上下文中的事件机制
                initApplicationEventMulticaster();
    
                // Initialize other special beans in specific context subclasses.
                // 初始化其他特殊Bean
                onRefresh();
    
                // Check for listener beans and register them.
                // 检查监听Bean并且将这些Bean向容器注册
                registerListeners();
    
                // Instantiate all remaining (non-lazy-init) singletons.
                // 实例化所有的单例且为非懒加载的Bean,并向容器注册这些Bean(包括业务Bean)
                finishBeanFactoryInitialization(beanFactory);
    
                // Last step: publish corresponding event.、
                // 发布容器事件,结束refresh过程
                finishRefresh();
            }
    
            catch (BeansException ex) {
                if (logger.isWarnEnabled()) {
                    logger.warn("Exception encountered during context initialization - " +
                            "cancelling refresh attempt: " + ex);
                }
    
                // Destroy already created singletons to avoid dangling resources.
                // 防止Bean资源占用,在异常处理中,销毁已经砸前面生成的Bean
                destroyBeans();
    
                // Reset 'active' flag.
                // 重置 'active' 标志
                cancelRefresh(ex);
    
                // Propagate exception to caller.
                throw ex;
            }
    
            finally {
                // Reset common introspection caches in Spring's core, since we
                // might not ever need metadata for singleton beans anymore...
                resetCommonCaches();
            }
        }
    }
    
    • registerBeanPostProcessors():完成了所有后置处理器 BeanPostProcessor 的实例化,并注册到容器。
    • finishBeanFactoryInitialization(beanFactory);:方法完成了对所有业务单例Bean的初始化,并注册到容器。

    registerBeanPostProcessors 注册所有后置处理器

    调用链路:

    registerBeanPostProcessors:188, PostProcessorRegistrationDelegate (org.springframework.context.support)
    registerBeanPostProcessors:703, AbstractApplicationContext (org.springframework.context.support)
    refresh:528, AbstractApplicationContext (org.springframework.context.support)
    <init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
    

    源码:

    // 完成了所有后置处理器 BeanPostProcessor 的实例化,并注册到容器。
    public static void registerBeanPostProcessors(
            ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
        
        // 从容器中找出所有的后置处理器的名称
        String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
    
        // Register BeanPostProcessorChecker that logs an info message when
        // a bean is created during BeanPostProcessor instantiation, i.e. when
        // a bean is not eligible for getting processed by all BeanPostProcessors.
        int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
        beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
    
        // Separate between BeanPostProcessors that implement PriorityOrdered,
        // Ordered, and the rest.
        List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
        List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();
        List<String> orderedPostProcessorNames = new ArrayList<String>();
        List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
        // 对后置处理器进行分类 分为PriorityOrdered、Ordered和regular三类
        for (String ppName : postProcessorNames) {
            // PriorityOrdered 类
            if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                // 完成后置处理器的实例化
                BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
                priorityOrderedPostProcessors.add(pp);
                if (pp instanceof MergedBeanDefinitionPostProcessor) {
                    internalPostProcessors.add(pp);
                }
            }
            // Order 类
            else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
                orderedPostProcessorNames.add(ppName);
            }
            // nonOrdered类
            else {
                nonOrderedPostProcessorNames.add(ppName);
            }
        }
    
        // 首先将实现PriorityOrdered接口的BeanPostProcessors注册到容器
        sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
        registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
    
        // 其次将实现Ordered接口的BeanPostProcessors实例化并注册到容器
        List<BeanPostProcessor> orderedPostProcessors = new ArrayList<BeanPostProcessor>();
        for (String ppName : orderedPostProcessorNames) {
            // 完成后置处理器的实例化
            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
            orderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
                internalPostProcessors.add(pp);
            }
        }
        sortPostProcessors(orderedPostProcessors, beanFactory);
        registerBeanPostProcessors(beanFactory, orderedPostProcessors);
    
        // 再次将常规的BeanPostProcessors实例化并注册到容器
        List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
        for (String ppName : nonOrderedPostProcessorNames) {
            // 完成后置处理器的实例化
            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
            nonOrderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
                internalPostProcessors.add(pp);
            }
        }
        registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
    
        // 最后从新将所有内部的BeanPostProcessors注册到容器
        sortPostProcessors(internalPostProcessors, beanFactory);
        registerBeanPostProcessors(beanFactory, internalPostProcessors);
    
        // Re-register post-processor for detecting inner beans as ApplicationListeners,
        // moving it to the end of the processor chain (for picking up proxies etc).
        // 重新注册ApplicationListenerDetector后置处理器
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
    }
    

    执行过程:

    1. 从容器中找出所有的后置处理器的名称
    2. 对后置处理器进行分类,分为PriorityOrdered、Ordered和regular三类
    3. 将实现PriorityOrdered接口的BeanPostProcessors实例化并注册到容器
    4. 将实现Ordered接口的BeanPostProcessors实例化并注册到容器
    5. 将常规的BeanPostProcessors实例化并注册到容器
    6. 从新将所有内部的BeanPostProcessors注册到容器
    7. 重新注册ApplicationListenerDetector后置处理器

    PriorityOrdered继承自Ordered,但是并没有任何的增强。PriorityOrdered仅仅是一个标志,从上面的源代码我们可以看出,不管getOrder()返回值的大小,PriorityOrdered的优先级始终高于Ordered。

    finishBeanFactoryInitialization() 注册所有业务Bean

    调用链路:

    finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
    refresh:543, AbstractApplicationContext (org.springframework.context.support)
    <init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
    

    InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation() 创建Bean的前置处理方法

    InstantiationAwareBeanPostProcessor:这个后置处理器主要运行在在实例化Bean的前后,主要作用是对Bean的实例化进行扩展处理。

    实例化之前调用 postProcessBeforeInstantiation() 方法,调用链路:

    postProcessBeforeInstantiation:20, InitBeanInstantiationAwareBeanPostProcessor (com.xiaolyuh.init.destory)
    applyBeanPostProcessorsBeforeInstantiation:1045, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    resolveBeforeInstantiation:1019, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    createBean:473, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
    getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
    doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
    getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
    preInstantiateSingletons:761, DefaultListableBeanFactory (org.springframework.beans.factory.support)
    finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
    refresh:543, AbstractApplicationContext (org.springframework.context.support)
    <init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
    

    源码:

    @Override
    protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
        ...
        try {
            // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
            // 调用创建bean的前置方法 InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
            Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
            if (bean != null) {
                return bean;
            }
        }
        ...
        // 创建Bean实例并放到容器中
        Object beanInstance = doCreateBean(beanName, mbdToUse, args);
        return beanInstance;
    }
    
    // 调用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()方法
    protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof InstantiationAwareBeanPostProcessor) {
                InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
                if (result != null) {
                    return result;
                }
            }
        }
        return null;
    }
    

    doCreateBean() 创建Bean

    调用链路:

    doCreateBean:513, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    createBean:483, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
    getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
    doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
    getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
    preInstantiateSingletons:761, DefaultListableBeanFactory (org.springframework.beans.factory.support)
    finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
    refresh:543, AbstractApplicationContext (org.springframework.context.support)
    <init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
    

    源码:

    protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
            throws BeanCreationException {
    
        // 实例化Bean
        BeanWrapper instanceWrapper = null;
        ...
        if (instanceWrapper == null) {
            instanceWrapper = createBeanInstance(beanName, mbd, args);
        }
        ...
    
        // 执行MergedBeanDefinitionPostProcessor后置处理器,运行时合并bean的定义(RootBeanDefinition)。
        // 比如处理@Autowired、@Resource、@Vaule等注解
        synchronized (mbd.postProcessingLock) {
            ...
            applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
            ...
        }
    
        ...
    
        // 初始化Bean实例
        Object exposedObject = bean;
        try {
            // 设置属性值
            populateBean(beanName, mbd, instanceWrapper);
            if (exposedObject != null) {
                // 初始化Bean
                exposedObject = initializeBean(beanName, exposedObject, mbd);
            }
        }
        catch (Throwable ex) {
            if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
                throw (BeanCreationException) ex;
            }
            else {
                throw new BeanCreationException(
                        mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
            }
        }
    
        ...
    
        // Register bean as disposable.
        try {
            registerDisposableBeanIfNecessary(beanName, bean, mbd);
        }
        ...
    
        return exposedObject;
    }
    

    创建Bean的过程:

    1. 实例化Bean
    2. 执行MergedBeanDefinitionPostProcessor后置处理器
    3. 设置属性值
    4. 初始化Bean实例

    createBeanInstance() 实例化Bean

    调用链路:

    createBeanInstance:1069, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    doCreateBean:513, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    createBean:483, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
    getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
    doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
    getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
    preInstantiateSingletons:761, DefaultListableBeanFactory (org.springframework.beans.factory.support)
    finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
    refresh:543, AbstractApplicationContext (org.springframework.context.support)
    <init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
    

    源码:

    protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
        ...
        // 确定是否需要调用特定构造函数
        Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
        if (ctors != null ||
                mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
                mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args))  {
            // 调用特定构造函数
            return autowireConstructor(beanName, mbd, ctors, args);
        }
    
        // 调用无参构造函数
        return instantiateBean(beanName, mbd);
    }
    
    // 反射调用无参构造函数创建实例
    protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
        try {
            Object beanInstance;
            final BeanFactory parent = this;
            ...
            else {
                // 通过反射创建实例
                beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
            }
            // 将实例包装成 BeanWrapper
            BeanWrapper bw = new BeanWrapperImpl(beanInstance);
            initBeanWrapper(bw);
            return bw;
        }
        ...
    }
    

    执行MergedBeanDefinitionPostProcessor后置处理器

    MergedBeanDefinitionPostProcessor:他主要作用就是对Bean的定义进行合并,如解析Bean中的@Autowired@Resource@Vaule等注解,并将其封装成成InjectedElement,如 AutowiredFieldElementAutowiredMethodElementResourceElement等。最后合并元数据信息到RootBeanDefinition.externallyManagedConfigMembers上。

    postProcessMergedBeanDefinition:298, CommonAnnotationBeanPostProcessor (org.springframework.context.annotation)
    applyMergedBeanDefinitionPostProcessors:1000, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    doCreateBean:523, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    createBean:483, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
    getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
    doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
    getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
    preInstantiateSingletons:761, DefaultListableBeanFactory (org.springframework.beans.factory.support)
    finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
    refresh:543, AbstractApplicationContext (org.springframework.context.support)
    <init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
    

    源码:

    @Override
    public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
        super.postProcessMergedBeanDefinition(beanDefinition, beanType, beanName);
        if (beanType != null) {
            // 找到元数据信息
            InjectionMetadata metadata = findResourceMetadata(beanName, beanType, null);
            // 校验并合并元数据信息
            metadata.checkConfigMembers(beanDefinition);
        }
    }
    
    // checkConfigMembers:70, InjectionMetadata (org.springframework.beans.factory.annotation)
    public void checkConfigMembers(RootBeanDefinition beanDefinition) {
        Set<InjectedElement> checkedElements = new LinkedHashSet<InjectedElement>(this.injectedElements.size());
        for (InjectedElement element : this.injectedElements) {
            Member member = element.getMember();
            if (!beanDefinition.isExternallyManagedConfigMember(member)) {
                // 合并元数据信息
                beanDefinition.registerExternallyManagedConfigMember(member);
                checkedElements.add(element);
                if (logger.isDebugEnabled()) {
                    logger.debug("Registered injected element on class [" + this.targetClass.getName() + "]: " + element);
                }
            }
        }
        this.checkedElements = checkedElements;
    }
    

    populateBean() 设置属性值

    这其实就是@Autowired注解对应后置处理器AutowiredAnnotationBeanPostProcessor的执行流程。而主要起作用的是InstantiationAwareBeanPostProcessor后置处理器,这里会先调用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()方法,再调用InstantiationAwareBeanPostProcessor.postProcessPropertyValues()方法。在InstantiationAwareBeanPostProcessor.postProcessPropertyValues()方法中我们会将属性的值通过反射设置进去,下面是调用链路:

    populateBean:1272, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    doCreateBean:553, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    createBean:483, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
    getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
    doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
    getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
    preInstantiateSingletons:761, DefaultListableBeanFactory (org.springframework.beans.factory.support)
    finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
    refresh:543, AbstractApplicationContext (org.springframework.context.support)
    <init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
    

    源码:

    protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
        PropertyValues pvs = mbd.getPropertyValues();
        ...
        // 执行InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
        if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
            for (BeanPostProcessor bp : getBeanPostProcessors()) {
                if (bp instanceof InstantiationAwareBeanPostProcessor) {
                    InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                    // 如果该方法返回false,那么会阻断后面后置处理器的执行。
                    if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                        continueWithPropertyPopulation = false;
                        break;
                    }
                }
            }
        }
        // 阻断后面后置处理器的执行。
        if (!continueWithPropertyPopulation) {
            return;
        }
    
        ...
        if (hasInstAwareBpps || needsDepCheck) {
            PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
            if (hasInstAwareBpps) {
                // 执行InstantiationAwareBeanPostProcessor.postProcessPropertyValues 使用反射给属性赋值
                for (BeanPostProcessor bp : getBeanPostProcessors()) {
                    if (bp instanceof InstantiationAwareBeanPostProcessor) {
                        InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                        pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
                        if (pvs == null) {
                            return;
                        }
                    }
                }
            }
            if (needsDepCheck) {
                checkDependencies(beanName, mbd, filteredPds, pvs);
            }
        }
    
        applyPropertyValues(beanName, mbd, bw, pvs);
    }
    

    InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation ()

    调用链路:

    postProcessAfterInstantiation:308, CommonAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
    populateBean:1272, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    

    源码:

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        return true;
    }
    

    postProcessAfterInstantiation 如果该方法返回false,那么会阻断后面后置处理器的执行。

    InstantiationAwareBeanPostProcessor.postProcessPropertyValues()

    在这个方法中我们会将属性的值通过反射设置进去,调用链路:

    resolveCandidate:208, DependencyDescriptor (org.springframework.beans.factory.config)
    doResolveDependency:1138, DefaultListableBeanFactory (org.springframework.beans.factory.support)
    resolveDependency:1066, DefaultListableBeanFactory (org.springframework.beans.factory.support)
    inject:585, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
    inject:88, InjectionMetadata (org.springframework.beans.factory.annotation)
    postProcessPropertyValues:366, AutowiredAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
    populateBean:1272, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    

    源码:

    @Override
    public PropertyValues postProcessPropertyValues(
            PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeanCreationException {
        
        // 找到需要自动装配的元数据
        InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);
        try {
            // 使用反射填充Bean
            metadata.inject(bean, beanName, pvs);
        }
        catch (BeanCreationException ex) {
            throw ex;
        }
        catch (Throwable ex) {
            throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);
        }
        return pvs;
    }
    
    @Override
    protected void inject(Object bean, String beanName, PropertyValues pvs) throws Throwable {
        Field field = (Field) this.member;
        Object value;
        ...
        try {
            // 获取属性值,如果设置也是Bean,那么会调用beanFactory.getBean(beanName, requiredType);方法,调用链路:
            // resolveCandidate:208, DependencyDescriptor (org.springframework.beans.factory.config)
            // doResolveDependency:1138, DefaultListableBeanFactory (org.springframework.beans.factory.support)
            // resolveDependency:1066, DefaultListableBeanFactory (org.springframework.beans.factory.support)
            // inject:585, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
            value = beanFactory.resolveDependency(desc, beanName, autowiredBeanNames, typeConverter);
        }
        ...
            
        if (value != null) {
            // 设置属性值
            ReflectionUtils.makeAccessible(field);
            field.set(bean, value);
        }
    }
    

    initializeBean() 初始化实例

    初始化主要分为四步:

    1. 执行部分Spring Awar方法
    2. 执行BeanPostProcessors后置处理器的postProcessBeforeInitialization方法
    3. 执行自定义的初始化Bean方法,afterPropertiesSet()-> @Bean 注解的 initMethod 方法
    4. 执行BeanPostProcessors后置处理器的postProcessAfterInitialization方法

    调用链路:

    initializeBean:1621, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    doCreateBean:555, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    createBean:483, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
    getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
    doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
    getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
    invokeBeanFactoryPostProcessors:86, PostProcessorRegistrationDelegate (org.springframework.context.support)
    invokeBeanFactoryPostProcessors:687, AbstractApplicationContext (org.springframework.context.support)
    refresh:525, AbstractApplicationContext (org.springframework.context.support)
    <init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
    

    源码:

    protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
        ...
        // 执行部分Spring Awar方法
        invokeAwareMethods(beanName, bean);
    
        Object wrappedBean = bean;
        if (mbd == null || !mbd.isSynthetic()) {
            // 执行BeanPostProcessors后置处理器的postProcessBeforeInitialization方法
            wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
        }
    
        try {
            // 执行自定义的初始化Bean方法,afterPropertiesSet()-> @Bean 注解的 initMethod 方法
            invokeInitMethods(beanName, wrappedBean, mbd);
        }
        catch (Throwable ex) {
            throw new BeanCreationException(
                    (mbd != null ? mbd.getResourceDescription() : null),
                    beanName, "Invocation of init method failed", ex);
        }
        if (mbd == null || !mbd.isSynthetic()) {
            // 执行BeanPostProcessors后置处理器的postProcessAfterInitialization方法
            wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
        }
        return wrappedBean;
    }
    

    invokeAwareMethods() 执行部分Spring Awar方法

    调用链路:

    invokeAwareMethods:1644, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    initializeBean:1621, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    

    源码:

    private void invokeAwareMethods(final String beanName, final Object bean) {
        if (bean instanceof Aware) {
            if (bean instanceof BeanNameAware) {
                ((BeanNameAware) bean).setBeanName(beanName);
            }
            if (bean instanceof BeanClassLoaderAware) {
                ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
            }
            if (bean instanceof BeanFactoryAware) {
                ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
            }
        }
    }
    
    1. 先判断是否是实现了Aware接口
    2. 在判断具体实现了那个Aware接口
    3. 根据具体实现的Aware调用对应回调方法

    BeanPostProcessors.postProcessBeforeInitialization() 后置处理器的前置方法执行

    调用链路:

    applyBeanPostProcessorsBeforeInitialization:407, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    initializeBean:1626, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    

    源码:

    @Override
    public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
            throws BeansException {
    
        Object result = existingBean;
        for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
            result = beanProcessor.postProcessBeforeInitialization(result, beanName);
            if (result == null) {
                return result;
            }
        }
        return result;
    }
    

    获取到所有BeanPostProcessors后置处理器,循环执行其postProcessBeforeInitialization方法,我们在上面说过BeanPostProcessors是有顺序的。

    这里我们重点看ApplicationContextAwareProcessor和InitDestroyAnnotationBeanPostProcessor两个后置处理器postProcessBeforeInitialization方法的代码。

    • ApplicationContextAwareProcessor主要实现了Spring Aware,上面invokeAwareMethods()方法执行力一部分Spring Aware的方法,剩下的Aware主要就是用ApplicationContextAwareProcessor来实现的。
    • InitDestroyAnnotationBeanPostProcessor主要是实现了Bean的@PostConstruct和@PreDestroy方法。
    ApplicationContextAwareProcessor.postProcessBeforeInitialization() 后置处理器的执行
    @Override
    public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
        ...
        invokeAwareInterfaces(bean);
        ...
        return bean;
    }
    
    //   判断Bean是实现的那个Aware接口,然后调用对应的感知方法。
    private void invokeAwareInterfaces(Object bean) {
        if (bean instanceof Aware) {
            if (bean instanceof EnvironmentAware) {
                ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
            }
            if (bean instanceof EmbeddedValueResolverAware) {
                ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
            }
            if (bean instanceof ResourceLoaderAware) {
                ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
            }
            if (bean instanceof ApplicationEventPublisherAware) {
                ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
            }
            if (bean instanceof MessageSourceAware) {
                ((MessageSourceAware) bean).setMessageSource(this.applicationContext);
            }
            if (bean instanceof ApplicationContextAware) {
                ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
            }
        }
    }
    
    1. 先判断是否是实现了Aware接口
    2. 在判断具体实现了那个Aware接口
    3. 根据具体实现的Aware调用对应回调方法

    Aware的执行顺序:

    1. BeanNameAware
    2. BeanClassLoaderAware
    3. BeanFactoryAware
    4. EnvironmentAware
    5. EmbeddedValueResolverAware
    6. ResourceLoaderAware
    7. ApplicationEventPublisherAware
    8. MessageSourceAware
    9. ApplicationContextAware
    InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization() 后置处理器的执行

    调用链路:

    postConstructstroy:51, InitBeanAndDestroyBean (com.xiaolyuh.init.destory)
    invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
    invoke:62, NativeMethodAccessorImpl (sun.reflect)
    invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
    invoke:498, Method (java.lang.reflect)
    invoke:366, InitDestroyAnnotationBeanPostProcessor$LifecycleElement (org.springframework.beans.factory.annotation)
    invokeInitMethods:311, InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata (org.springframework.beans.factory.annotation)
    postProcessBeforeInitialization:134, InitDestroyAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
    applyBeanPostProcessorsBeforeInitialization:409, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    initializeBean:1626, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    

    源码:

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        LifecycleMetadata metadata = findLifecycleMetadata(bean.getClass());
        // 执行初始化方法
        metadata.invokeInitMethods(bean, beanName);
        ...
        return bean;
    }
    
    // 执行@PostConstruct方法
    public void invokeInitMethods(Object target, String beanName) throws Throwable {
        Collection<LifecycleElement> initMethodsToIterate =
                (this.checkedInitMethods != null ? this.checkedInitMethods : this.initMethods);
        if (!initMethodsToIterate.isEmpty()) {
            boolean debug = logger.isDebugEnabled();
            for (LifecycleElement element : initMethodsToIterate) {
                // 通过反射调用@PostConstruct方法
                element.invoke(target);
            }
        }
    }
    
    1. 先通过findLifecycleMetadata方法找到被@PostConstruct注解的元数据
    2. 通过反射调用@PostConstruct方法

    invokeInitMethods() 执行自定义的初始化Bean方法

    执行自定义的初始化Bean方法,执行顺序是afterPropertiesSet() -> @Bean 注解的 initMethod 方法。
    调用链路:

    invokeInitMethods:1673, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    initializeBean:1630, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    doCreateBean:555, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    createBean:483, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
    getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
    doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
    getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
    invokeBeanFactoryPostProcessors:86, PostProcessorRegistrationDelegate (org.springframework.context.support)
    invokeBeanFactoryPostProcessors:687, AbstractApplicationContext (org.springframework.context.support)
    refresh:525, AbstractApplicationContext (org.springframework.context.support)
    <init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
    

    源码:

    protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
            throws Throwable {
    
        // 先判断是否实现了InitializingBean接口,如果是则调用afterPropertiesSet方法
        boolean isInitializingBean = (bean instanceof InitializingBean);
        if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
            if (logger.isDebugEnabled()) {
                logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
            }
            if (System.getSecurityManager() != null) {
                try {
                    AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
                        @Override
                        public Object run() throws Exception {
                            ((InitializingBean) bean).afterPropertiesSet();
                            return null;
                        }
                    }, getAccessControlContext());
                }
                catch (PrivilegedActionException pae) {
                    throw pae.getException();
                }
            }
            else {
                ((InitializingBean) bean).afterPropertiesSet();
            }
        }
        // 判断声明Bean时是否配置了initMethod方法,如果配置了则使用反射调用该方法
        if (mbd != null) {
            String initMethodName = mbd.getInitMethodName();
            if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
                    !mbd.isExternallyManagedInitMethod(initMethodName)) {
                invokeCustomInitMethod(beanName, bean, mbd);
            }
        }
    }
    
    1. 先判断是否实现了InitializingBean接口,如果是则调用afterPropertiesSet方法
    2. 判断声明Bean时是否配置了initMethod方法,如果配置了则使用反射调用该方法

    BeanPostProcessors.postProcessAfterInitialization() 后置处理器的后置方法执行

    调用链路:

    postProcessAfterInitialization:296, AbstractAutoProxyCreator (org.springframework.aop.framework.autoproxy)
    applyBeanPostProcessorsAfterInitialization:423, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    initializeBean:1638, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    doCreateBean:555, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    createBean:483, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
    getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
    getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
    doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
    getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
    preInstantiateSingletons:761, DefaultListableBeanFactory (org.springframework.beans.factory.support)
    finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
    refresh:543, AbstractApplicationContext (org.springframework.context.support)
    <init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
    

    源码:

    @Override
    public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
            throws BeansException {
    
        Object result = existingBean;
        // 获取所有后置处理器,然后调用其postProcessAfterInitialization方法
        for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
            result = beanProcessor.postProcessAfterInitialization(result, beanName);
            if (result == null) {
                return result;
            }
        }
        return result;
    }
    
    • AnnotationAwareAspectJAutoProxyCreator:AOP代理的后置处理器,AOP生成代理的地方就是在后置处理器的postProcessAfterInitialization方法中实现的。

    相关文章

      网友评论

          本文标题:Spring 源码(五)初始化所有单例Bean,并注册到容器(B

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