zoukankan      html  css  js  c++  java
  • spring的9个地方调用了5次后置处理器的详细情况

    从getSingleton方法开始:

    sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
                            @Override
                            public Object getObject() throws BeansException {
                                try {
                                    return createBean(beanName, mbd, args);
                                }
                                catch (BeansException ex) {
                                    // Explicitly remove instance from singleton cache: It might have been put there
                                    // eagerly by the creation process, to allow for circular reference resolution.
                                    // Also remove any beans that received a temporary reference to the bean.
                                    destroySingleton(beanName);
                                    throw ex;
                                }
                            }
                        });

    其中的createBean方法中就有bean的处理器。

    beanPostProcess只是顶层处理器,相当于一个最基本的后置处理器它会贯穿所有spring的bean初始化时的阶段,会在initializationBean中调用。

    实际上还有很多后置处理器的更多具体实现:

    个方法:resolveBeforeInstantiation ,获取所有后置处理器,判断是否为InstantiationAwareBeanPostProcessor实现类型,调用的方法是:postProcessBeforeInstantiation

    这个后置处理器很关键,InstantiationAwareBeanPostProcessor有3个方法,第一个方法postProcessBeforeInstantiation如果你直接返回一个“自建对象”的话,那spring上下文直接就会把你的这个对象放入容器中,并执行BeanPostProcessor的postProcessAfterInitialization方法。如果第一个方法返回为null,则spring创建bean的流程会继续执行,会在populateBean方法中继续调用postProcessAfterInstantiation和postProcessPropertyValues来进行属性的装配。

    如果这里出现了aop的切面类,就会有InstantiationAwareBeanPostProcessor的子处理器进行类的过滤,出现@AspectJ的类标记为不需要代理的类,会被放入map中

    个方法:在createBeanInstance中的determineConstructorsFromBeanPostProcessors方法中,判断是否为SmartInstantiationAwareBeanPostProcessor类型的后置处理器,调用的方法是:determineCandidateConstructors,这个方法用来推断构造函数,实际使用的实现SmartInstantiationAwareBeanPostProcessor接口的AutowiredAnnotationBeanPostProcess后置处理器去做的。

    个方法:在createBeanInstance中的applyMergedBeanDefinitionPostProcessors方法中,判断为MergedBeanDefinitionPostProcessor,调用的方法是:postProcessMergedBeanDefinition,用来缓存注解信息

    个方法:在createBeanInstance中的getEarlyBeanReference方法中,判断是否为SmartInstantiationAwareBeanPostProcessor,调用的方法是:getEarlyBeanReference

     这个方法是来解决循环依赖问题的这里很重要,要详细的分析

    个方法:在populateBean中的会调用InstantiationAwareBeanPostProcessor这个处理器,调用的方法是:postProcessAfterInstantiation

    个方法:在populateBean中的又会调用InstantiationAwareBeanPostProcessor这个处理器,但是调用的方法是postProcessPropertyValues

    第七个方法:在initializationBean中调用的是BeanPostProcess的postProcessBeforInitialization方法

    第八个方法:在initializationBean中调用的是BeanPostProcess的postProcessAfterInitialization方法

    第九个是销毁时的方法

  • 相关阅读:
    .NET HttpWebRequest应用
    .NET 文件上传和文件接收
    小程序报错:对应的服务器 TLS 为 TLS 1.0 ,小程序要求的 TLS 版本必须大于等于 1.2
    发布微信小程序体验版
    .NET 通过entity framework报数据库连接错误:ORA-01017: invalid username/password; logon denied
    将Oracle 12c的某用户数据迁移至OracleXE的用户
    C# Oracle 时间字符串转时间类型
    在.NET中调用Java的类
    Oracle 取前几条记录
    oracle impdp将导出用户的所有对象导入至另一个用户下,生成的触发器语句问题处理
  • 原文地址:https://www.cnblogs.com/zzq-include/p/12228461.html
Copyright © 2011-2022 走看看