Spring IOC (三)

Spring IOC (三)

refresh()

后八个方法

refresh()

定义:

​ 这个方法中,内置了13个方法,做了很多事情

方法:

方法作用
prepareRefresh()保存了容器的启动时间,启动标志等
obtainFreshBeanFactory();获得了DefaultListableBeanFactory
prepareBeanFactory(beanFactory);添加了两个后置处理器
忽略自动装配 和 允许自动装配
bean表达式解析器
postProcessBeanFactory(beanFactory);空方法
invokeBeanFactoryPostProcessors(beanFactory);执行自定义的BeanFactoryProcessor
和内置的BeanFactoryProcessor
registerBeanPostProcessors(beanFactory);注册BeanPostProcessor
initMessageSource();初始化信息源
initApplicationEventMulticaster();初始化应用事件多播器
onRefresh();空方法
registerListeners();注册监听器,用于监听bean并注册他们
finishBeanFactoryInitialization(beanFactory);初始化所有剩余的单例 bean
finishRefresh();调用 生命周期处理器的onRefresh() 发布事件
destroyBeans();销毁所有单例池所有实例bean

registerBeanPostProcessors()

定义:

​ 重要方法,这个方法用来**实例化Bean的很多后置处理器**,在Bean的创建过程中,我们可以实现Spring给定的Bean后置处理器接口,来对Bean的创建过程进行一些修改

原理是:Spring会在这个过程中进行多次回调

源码:

protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    // 又调用了这个类的方法,跟进
    PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}

调用了 PostProcessorRegistrationDelegate 类的静态方法

源码:

public static void registerBeanPostProcessors(
    ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

	// 1. 内部通过遍历所有Bean定义,来找到所有的Bean后置处理器
    String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

    // 2. 注册一个BeanPostProcessorChecker,来记录过程
    int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
    beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

	// 又是分为最优先的、优先的、不优先的三种
    List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
    List<String> orderedPostProcessorNames = new ArrayList<>();
    List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    
    // 3. 遍历所有的Bean后置处理器名字
    for (String ppName : postProcessorNames) {
        // 最高优先级
        if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
            // 在这里实例化bean后置处理器
            BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);

            priorityOrderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
                internalPostProcessors.add(pp);
            }
        }
        // 次优先级
        else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
            orderedPostProcessorNames.add(ppName);
        }
        // 无优先级
        else {
            nonOrderedPostProcessorNames.add(ppName);
        }
    }
    // 4. 注册最高优先级的BeanPostProcessor 
    // (其实就是add到一个List中beanPostProcessors的list)
    sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

    
    // 5. 循环去找次优先级的BeanPostProcessor
    List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
    for (String ppName : orderedPostProcessorNames) {
        // 在这里实例化bean后置处理器
        BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
        orderedPostProcessors.add(pp);
        if (pp instanceof MergedBeanDefinitionPostProcessor) {
            internalPostProcessors.add(pp);
        }
    }
    // 6. 注册次优先级的BeanPostProcessor 
    // (其实就是add到一个List中beanPostProcessors的list)
    sortPostProcessors(orderedPostProcessors, beanFactory);
    registerBeanPostProcessors(beanFactory, orderedPostProcessors);

    
   
    // 7. 循环去找无优先级的BeanPostProcessor
    List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
    for (String ppName : nonOrderedPostProcessorNames) {
        // 实例化bean后置处理器
        BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
        nonOrderedPostProcessors.add(pp);
        if (pp instanceof MergedBeanDefinitionPostProcessor) {
            internalPostProcessors.add(pp);
        }
    }
    // 8. 注册无优先级的BeanPostProcessor
    // (其实就是add到一个List中beanPostProcessors的list)
    registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

    // 9. 最后执行Spring内部的BeanPostProcessor
    sortPostProcessors(internalPostProcessors, beanFactory);
    registerBeanPostProcessors(beanFactory, internalPostProcessors);

    // 10. 再次注册Spring的内置的监听器探测器,用来探测 **内部的应用监听器bean**
    beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}

小结:

这个方法比较简单,通过Bean定义找到所有BeanPostProcessor,然后主要做了三件事:

  • 匹配BeanPostProcessor
  • 排序BeanPostProcessor
  • 实例化BeanPosrProcessor

注意:不会执行BeanPostProcessor,这个适用于增强Bean的,到创建Bean的时候才会执行。

initMessageSource()

定义:

​ 这个方法主要是用于国际化

源码:

protected void initMessageSource() {
    ConfigurableListableBeanFactory beanFactory = getBeanFactory();

    // 1. 实现国际化的话,就必须配置一个Bean,且他的名称必须要是 messageSource
    // 用户自定义一个信息源
    if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
        this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
        if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
            HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
            if (hms.getParentMessageSource() == null) {
                // 2. 当父类没有注册信息源时,去设置父类的信息源
                hms.setParentMessageSource(getInternalParentMessageSource());
            }
        }
        if (logger.isTraceEnabled()) {
            logger.trace("Using MessageSource [" + this.messageSource + "]");
        }
    }
    else {
        // 3. 用户没有自定义,Spring默认配置
        DelegatingMessageSource dms = new DelegatingMessageSource();
        dms.setParentMessageSource(getInternalParentMessageSource());
        this.messageSource = dms;
        // 4. 将这个Bean注册到Bean工厂
        beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
        if (logger.isTraceEnabled()) {
            logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
        }
    }
}

initApplicationEventMulticaster()

定义:

​ 这个方法用于初始化应用事件多播器

源码:

protected void initApplicationEventMulticaster() {
    ConfigurableListableBeanFactory beanFactory = getBeanFactory();
    // 1. 检查 applicationEventMulticaster 的Bean或Bean定义是否存在
    if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
        // 2. 实例化bean并赋值
        this.applicationEventMulticaster =
            beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
        if (logger.isTraceEnabled()) {
            logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
        }
    }
    else {
        // 3. 如果不存在,那么new一个SimpleApplicationEventMulticaster
        this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
        // 4. 将该对象注入bean工厂
        beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
        if (logger.isTraceEnabled()) {
            logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
                         "[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
        }
    }
}

小结

​ 总的流程很简单,检查容器中有没有默认的事件多播器

  • 有就赋值给applicationEventMulticaster
  • 没有就实例化一个SimpleApplicationEventMulticaster 给applicationEventMulticaster

OnRefresh()

定义:

​ 空方法,给子类继承,就是SpringMVC那些用的

registerListeners()

定义:

​ 注册监听器

源码:

protected void registerListeners() {
    // 1. 首先注册静态的、指定的监听器,注册的是特殊的事件监听器,而不是配置中的bean
    for (ApplicationListener<?> listener : getApplicationListeners()) {
        getApplicationEventMulticaster().addApplicationListener(listener);
    }
    
    // 2. 实例化应用监听器Bean,排除==FactoryBean==,目的是为了让后置处理器能处理他们
    String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
    for (String listenerBeanName : listenerBeanNames) {
        getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
    }

    // 3. 现在有了事件广播组,发布之前的应用事件
    Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
    this.earlyApplicationEvents = null;
    if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
        for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
            // 4. 多播器发布早期事件,通知监听器
            getApplicationEventMulticaster().multicastEvent(earlyEvent);
        }
    }
}

小结:

一个订阅、发布的模式,主要是四个角色:

  • ApplicationEvent:事件,每个实现类表示一类事件,可携带数据。抽象类。
  • ApplicationListener:事件监听器,用于接收事件处理时间。接口。
  • ApplicationEventMulticaster:事件管理者,可以注册(添加)/移除/发布事件。用于事件监听器的注册和事件的广播。接口。
  • ApplicationEventPublisher:事件发布者,委托事件管理者ApplicationEventMulticaster完成事件发布。

finishBeanFactoryInitialization(beanFactory)

定义:

​ 实例化所有剩下的Bean,重要方法,这里有实例化bean的一个整体逻辑

源码:

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
    
    if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
        beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
        beanFactory.setConversionService(
            beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
    }

    
    if (!beanFactory.hasEmbeddedValueResolver()) {
        beanFactory.addEmbeddedValueResolver(new StringValueResolver() {
            @Override
            public String resolveStringValue(String strVal) {
                return getEnvironment().resolvePlaceholders(strVal);
            }
        });
    }

    // 1. 初始化LoadTimeWeaverAware Bean实例对象
    String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
    for (String weaverAwareName : weaverAwareNames) {
        getBean(weaverAwareName);
    }

    beanFactory.setTempClassLoader(null);

    // 2.冻结所有bean定义,注册的bean定义不会被修改或进一步后处理,因为马上要创建 Bean 实例对象了
    beanFactory.freezeConfiguration();

    // 3. 实例化所有剩余(非懒加载)单例对象   【重要】
    beanFactory.preInstantiateSingletons();
}

源码:

preInstantiateSingletons()方法,主要是去执行实例化剩余的单例对象

@Override
public void preInstantiateSingletons() throws BeansException {

    // 1. 创建bean定义副本
    List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);

    // 2. 循环遍历
    for (String beanName : beanNames) {
        RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
        // 3. 不是抽象类 && 是单例 && 不是懒加载 才有资格被实例化
        if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
            // 4. 是否为FactoryBean
            if (isFactoryBean(beanName)) {
                // 4.1 通过beanName获取FactoryBean实例
                /**
                 * 工厂bean的特性:  **& 前缀符**
                 * - 通过getBean(&beanName)拿到的是FactoryBean本身;
                 * - 通过getBean(beanName)拿到的是FactoryBean创建的Bean实例
                 */
                final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);
                // 4.2 判断这个FactoryBean是否希望急切的实例化
                boolean isEagerInit;
                if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                    isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
                        @Override
                        public Boolean run() {
                            return ((SmartFactoryBean<?>) factory).isEagerInit();
                        }
                    }, getAccessControlContext());
                } else {
                    isEagerInit = (factory instanceof SmartFactoryBean &&
                                   ((SmartFactoryBean<?>) factory).isEagerInit());
                }
                if (isEagerInit) {
                    // 4.3 如果希望急切的实例化,getbean()实例化
                    getBean(beanName);
                }
            } else {
                // 5. 普通bean,直接实例化
                getBean(beanName);
            }
        }
    }

    // 6. 上面已经实例化完所有的bean了
    // 7. 遍历beanNames,触发所有SmartInitializingSingleton的后实例化回调
    for (String beanName : beanNames) {
        Object singletonInstance = getSingleton(beanName);
        // 7.1 这个接口,可以让bean在**所有的bean实例化**完成后,执行一个**特定的方法**
        // 区别于,BeanPostProcessor,在bean**自己实例化**完成后,执行一个**特定的方法**
        // 7.2 判断singletonInstance是否实现了SmartInitializingSingleton接口
        if (singletonInstance instanceof SmartInitializingSingleton) {
            final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
            // 7.3 触发SmartInitializingSingleton实现类的afterSingletonsInstantiated方法
            if (System.getSecurityManager() != null) {
                // 7.4 Spring的安全控制
                AccessController.doPrivileged(new PrivilegedAction<Object>() {
                    @Override
                    public Object run() {
                        // 7.5 执行回调方法,无论如何都会执行
                        smartSingleton.afterSingletonsInstantiated();
                        return null;
                    }
                }, getAccessControlContext());
            } else {
                // 7.5 执行回调方法,无论如何都会执行
                smartSingleton.afterSingletonsInstantiated();
            }
        }
    }
}

小结:

该方法主要是区分FactoryBean和普通bean

并且调用回调函数==SmartInitializingSingleton接口==定义的函数

  • 该函数的意义:
    • 所有bean实例化都完成后,实现了这个接口的bean可以执行一个特定的方法

源码:

调用getBean()方法,可以实例化bean【假如说bean还没实例化】

@Override
public Object getBean(String name) throws BeansException {
    return doGetBean(name, null, null, false);
}

在Spring中,所有doXxxx()的方法都是真正执行具体操作的代码

源码:

doGetBean()方法,真正的去获取bean

protected <T> T doGetBean(
    String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) {
    // 1. 拿到beanName
    String beanName = transformedBeanName(name);
    Object beanInstance;

    // 2. 直接去单例池找之前有没有实例化过,如果找到直接返回
    Object sharedInstance = getSingleton(beanName);
    if (sharedInstance != null && args == null) {
        if (logger.isTraceEnabled()) {
            if (isSingletonCurrentlyInCreation(beanName)) {
                logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
                             "' that is not fully initialized yet - a consequence of a circular reference");
            }
            else {
                logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
            }
        }
        // 2.1 获取bean实例,准备返回
        beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null);
    }

    // 3. 单例池找不到,走去创建的逻辑
    else {
        // 3.1 如果是多例bean的循环依赖,直接报错!Spring无法解决多例bean的循环依赖
        if (isPrototypeCurrentlyInCreation(beanName)) {
            throw new BeanCurrentlyInCreationException(beanName);
        }

        BeanFactory parentBeanFactory = getParentBeanFactory();
        // 3.2 找不到这个beanName对应的beanDefinition,委托父工厂来doGetBean
        if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
            String nameToLookup = originalBeanName(name);
            if (parentBeanFactory instanceof AbstractBeanFactory) {
                // 3.3 委托父工厂,父 工厂是AbstractBeanFactory
                return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
                    nameToLookup, requiredType, args, typeCheckOnly);
            }
            else if (args != null) {
                // 3.4 委托父工厂,有参数
                return (T) parentBeanFactory.getBean(nameToLookup, args);
            }
            else if (requiredType != null) {
                // 3.5 委托父工厂,有Type
                return parentBeanFactory.getBean(nameToLookup, requiredType);
            }
            else {
                return (T) parentBeanFactory.getBean(nameToLookup);
            }
        }

        if (!typeCheckOnly) {
            markBeanAsCreated(beanName);
        }

        StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate")
            .tag("beanName", name);
        try {
            if (requiredType != null) {
                beanCreation.tag("beanType", requiredType::toString);
            }
            RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
            checkMergedBeanDefinition(mbd, beanName, args);

            // 4. 获取bean的依赖
            String[] dependsOn = mbd.getDependsOn();
            if (dependsOn != null) {
                for (String dep : dependsOn) {
                    registerDependentBean(dep, beanName);
                    try {
                        getBean(dep);
                    }
                }
            }

            // 5. 真正去创建bean,**单例创建**
            if (mbd.isSingleton()) {
                // 6. 从单例池中获取,传入 lambda函数方法 提供给 getSingleton()方法内回调
                sharedInstance = getSingleton(beanName, () -> {
                    try {
                        return createBean(beanName, mbd, args);
                    }
                });
                // 7. 包装,并获取bean实例
                beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
            }
            // 8. 多例bean创建
            else if (mbd.isPrototype()) {
                // It's a prototype -> create a new instance.
                Object prototypeInstance = null;
                try {
                    beforePrototypeCreation(beanName);
                    prototypeInstance = createBean(beanName, mbd, args);
                }
                finally {
                    afterPrototypeCreation(beanName);
                }
                beanInstance = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
            }
            // 9. 其他的Scope的Bean创建
            else {
                String scopeName = mbd.getScope();
                Scope scope = this.scopes.get(scopeName);
                try {
                    Object scopedInstance = scope.get(beanName, () -> {
                        beforePrototypeCreation(beanName);
                        try {
                            return createBean(beanName, mbd, args);
                        }
                        finally {
                            afterPrototypeCreation(beanName);
                        }
                    });
                    beanInstance = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
                }
            }
        }
        finally {
            beanCreation.end();
        }
    }

    // 根据requiredType,将beanInstance强转为目标类型,然后返回
    return adaptBeanInstance(name, beanInstance, requiredType);
}

小结:

通过doGetBean()主要做了

  • 从单例池中获取,如果没有,委托父工厂getBean,如果还没有,那就走创建的流程,有三种bean选择
    • 如果是单例bean
    • 如果是多例bean
    • 如果是特定的Scope的bean

源码:

getSingleton()方法有多个重载机制!!!!!很重要

  1. getSingleton(String beanName) —— 单例池寻找🔎,本质上会调用第二种

  2. getSingleton(String beanName, boolean allowEarlyReference) —— 单例池寻找,找不到会调用 函数方法,根据allowEarlyReference,决定是否获取早期引用对象

  3. getSingleton(String beanName, ObjectFactory<?> singletonFactory) —— 单例池寻找,找不到则调用 函数方法,执行createBean()执行创建bean流程

⚠注意!很重要!

​ 2和3的都会调用一个函数方法,他们各自调用的函数接口和时机都是不一样的

  • 第二种
    • 它的调用时机是,一开始进入getBean()时,马上调用的,它是用来避免循环依赖!一进来,发现自己正在处于循环依赖,就去调用函数方法执行getEarlyBeanReference()获取早期对象,暴露出来就给了一个出口给循环依赖
  • 第三种
    • 它的调用时机是,当前bean真的需要创建的时候【第二种调用无果】,后面真正创建时候调用的,它是用来**再次确认从单例池中获取bean,**如果拿不到,那就调用函数方法执行createBean(),真正地执行创建一个bean流程

第二种getSingleton()

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
   // 1. 利用了双重检测锁DCL,来获取单例
   Object singletonObject = this.singletonObjects.get(beanName);
    // 2. 如果单例池拿不到,并且正在创建,尝试从二级缓存找早期对象 【循环依赖】
   if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
       // 3. 早期对象获取
      singletonObject = this.earlySingletonObjects.get(beanName);
       // 4. 如果获取不到早期对象,并且允许获得早期引用
      if (singletonObject == null && allowEarlyReference) {
          // 加锁
         synchronized (this.singletonObjects) {
			// 5. 再拿一次,尝试
            singletonObject = this.singletonObjects.get(beanName);
            if (singletonObject == null) {
               singletonObject = this.earlySingletonObjects.get(beanName);
               if (singletonObject == null) {
                  ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                  if (singletonFactory != null) {
                      // 6. 获取函数方法,调用该方法获取早期的bean 
                      // 【调用getEarlyBeanReference()】,与下面不同,👇是createBean()
                     singletonObject = singletonFactory.getObject();
                      // 7. 早期的bean,存入二级缓存
                     this.earlySingletonObjects.put(beanName, singletonObject);
                      // 8. 马上删除函数方法,因为函数方法只用一次!
                     this.singletonFactories.remove(beanName);
                  }
               }
            }
         }
      }
   }
   return singletonObject;
}

函数方法调用getEarlyBeanReference()被放入的时机: —— 被依赖的bean已经完成实例化,但未开始填充属性的时机

第三种getSingleton()

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {

    synchronized (this.singletonObjects) {

        Object singletonObject = this.singletonObjects.get(beanName);
        beforeSingletonCreation(beanName);
        boolean newSingleton = false;
        boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
        if (recordSuppressedExceptions) {
            this.suppressedExceptions = new LinkedHashSet<>();
        }
        try {
            // 1. 调用之前传进来的回调,创建bean 
            // 2. 【createBean()】,与上面不同,👆是getEarlyBeanReference()
            singletonObject = singletonFactory.getObject();
            newSingleton = true;
        }
        // 3. 如果是一个新创建的bean,那么让他加入缓存
        if (newSingleton) {
            addSingleton(beanName, singletonObject);
        }
    }
    return singletonObject;
}

protected void addSingleton(String beanName, Object singletonObject) {
    synchronized (this.singletonObjects) {
        // 加入一级缓存
        this.singletonObjects.put(beanName, singletonObject);
        // 移除三级缓存
        this.singletonFactories.remove(beanName);
        // 移除二级缓存
        this.earlySingletonObjects.remove(beanName);
        this.registeredSingletons.add(beanName);
    }
}

函数方法调用createBean()被放入的时机: —— 第二次,也就是本次getSingleton()拿不到结果,就调用回调createBean()

源码:

createBean() 创建bean方法,—— 执行创建bean之前的一些准备动作

protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {

    RootBeanDefinition mbdToUse = mbd;

    Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
    if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
        mbdToUse = new RootBeanDefinition(mbd);
        mbdToUse.setBeanClass(resolvedClass);
    }

    // Prepare method overrides.
    try {
        mbdToUse.prepareMethodOverrides();
    }
    
    try {
        // 1. !这里是给第一次实例化普通bean的时候,封装Advisors的地方
        // 通过这里调用BeanPostProcessor的方法,
        // 实现扫描切面类,并封装【切点和通知 一一对应】
        Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
        if (bean != null) {
            return bean;
        }
    }

    try {
        // 2. 真正去创建一个bean
        Object beanInstance = doCreateBean(beanName, mbdToUse, args);
 		// 3. 返回
        return beanInstance;
    }
}

源码:

doCreateBean() 创建bean方法 —— 执行创建bean的方法

protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {

    // 1. 包装Bean
    BeanWrapper instanceWrapper = null;
    // 2. 单例
    if (mbd.isSingleton()) {
        instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    }
    if (instanceWrapper == null) {
        // 3. 走创建bean的流程
        instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    // 4. 获取包装的原型bean
    Object bean = instanceWrapper.getWrappedInstance();
    Class<?> beanType = instanceWrapper.getWrappedClass();
    if (beanType != NullBean.class) {
        mbd.resolvedTargetType = beanType;
    }

    synchronized (mbd.postProcessingLock) {
        if (!mbd.postProcessed) {
            try {
                // 5. 调用合并beanDefinition的一个后置处理器
                applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
            }
            mbd.postProcessed = true;
        }
    }

	// 6. 关键,打破循环依赖
    // 是单例 && 允许循环依赖 && 当前bean正在创建 ,早期暴露
    boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName));
    if (earlySingletonExposure) {
        // 7. 满足条件,在填充属性前!!!早期暴露bean,将早期暴露的函数方法存入三级缓存
        // 7.1 这个getEarlyBeanReference()函数,在获取早期对象的时候,会去判断是否需要AOP,如果要,就会给这个早期对象创建动态代理
        addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
    }

    // 8. 已经实例化的bean
    Object exposedObject = bean;
    try {
        // 9. 填充属性
        populateBean(beanName, mbd, instanceWrapper);
        // 10. 初始化bean
        exposedObject = initializeBean(beanName, exposedObject, mbd);
    }

    if (earlySingletonExposure) {
        Object earlySingletonReference = getSingleton(beanName, false);
        /**
         * 11. 再去取一次早期单例引用呢???
         * ===> 为什么要这么做?
         * 因为如果出现了循环依赖的话,如果当前beanA需要AOP,那么它是提前AOP的,
         * 即当前beanA仍然是普通对象,
         * 而B.a,已经是提前AOP了
         * 所以现在要拿出那个代理对象(B.a)给当前beanA
         */
        if (earlySingletonReference != null) {
            if (exposedObject == bean) {
                exposedObject = earlySingletonReference;
            }
            else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
                String[] dependentBeans = getDependentBeans(beanName);
                Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
                for (String dependentBean : dependentBeans) {
                    if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
                        actualDependentBeans.add(dependentBean);
                    }
                }
            }
        }
    }

    // Register bean as disposable.
    try {
        registerDisposableBeanIfNecessary(beanName, bean, mbd);
    }

    return exposedObject;
}

源码:

最后看一个==initializeBean()==方法,它做了很多事请,能保证

  • 生命周期回调
  • BeanPostProcessor后置处理器增强
  • init初始化方法

这三种增强的操作都是依赖这个方法实现的

protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
    if (System.getSecurityManager() != null) {
        AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
            // 1. 执行生命周期回调方法 Aware接口的
            invokeAwareMethods(beanName, bean);
            return null;
        }, getAccessControlContext());
    }
    else {
        // 1. 执行生命周期回调方法 Aware接口的 
        invokeAwareMethods(beanName, bean);
    }

    Object wrappedBean = bean;
    if (mbd == null || !mbd.isSynthetic()) {
        // 2. 执行BeanProcessor的初始化前的增强方法的
        wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    }

    try {
        // 3. 如果当前bean实现了初始化接口,那么执行init()方法的
        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()) {
        // 4. 执行BeanProcessor的初始化后的增强方法的
        wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }

    return wrappedBean;
}

小结:

这个方法保证了三种增强的执行:

  • Aware回调
  • BeanPostProcessor后置处理器增强回调
  • 初始化方法init()的回调

分析结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值