think in spring refresh 6

refresh 方法的第6步:   ( 主要处理 BeanPostProcessor, 该接口是对bean的扩展,用在 bean实例化之后,执行初始化方法前后,允许开发者对bean实例进行修改 )

  主要就是创建了所有的 Bean后置处理器实例,并将他们添加到了 beanFactory中的 list 变量中进行存储。

    // Register bean processors that intercept bean creation.
    registerBeanPostProcessors(beanFactory);

 

    /**
     * Instantiate and register all BeanPostProcessor beans,
     * respecting explicit order if given.
     * <p>Must be called before any instantiation of application beans.
     */
    protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
        PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
    }

 

public static void registerBeanPostProcessors(
            ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
// 1 找到所有实现了 BeanPostProcessor 接口的类   从哪里,怎么找的??
        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<>(); // 存放的是对象实例,不是说BeanDefinition List<BeanPostProcessor> internalPostProcessors = new ArrayList<>(); // 这个有什么用 List<String> orderedPostProcessorNames = new ArrayList<>(); // 存放的是beanName, 不是对象实例 List<String> nonOrderedPostProcessorNames = new ArrayList<>(); for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); // 创建bean的后置处理器 priorityOrderedPostProcessors.add(pp); // 存放的是对象实例 if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); // 存放的只是beanName,没有存放对象实例,而且此时对象实列也没有创建出来。 } else { nonOrderedPostProcessorNames.add(ppName); // 存放的是beanName } } // First, register the BeanPostProcessors that implement PriorityOrdered. sortPostProcessors(priorityOrderedPostProcessors, beanFactory); // 进行排序,底层用到了 Comparable。 registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); // 将创建好的 后置处理器添加到 beanFactory 的变量中 // Next, register the BeanPostProcessors that implement Ordered. List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size()); 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); // 添加到beanFactory的变量中,具体是在 AbstractApplicationContext中 // Now, register all regular BeanPostProcessors. List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size()); for (String ppName : nonOrderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); nonOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); // Finally, re-register all internal 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).
 // 重新注册 监听器探测器,之前注册过一次,为什么要重新注册一次
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); 
    }

 

AbstractApplicationContext中有一个list变量,用来存储后置处理器。

    /** BeanPostProcessors to apply. */
    private final List<BeanPostProcessor> beanPostProcessors = new CopyOnWriteArrayList<>();

 

问题1 : 如何做到找到所有实现了BeanFactory接口的类的?

@Override
    public String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit) {
        if (!isConfigurationFrozen() || type == null || !allowEagerInit) {
            return doGetBeanNamesForType(ResolvableType.forRawClass(type), includeNonSingletons, allowEagerInit); // 调用这个方法
        }
        Map<Class<?>, String[]> cache =
                (includeNonSingletons ? this.allBeanNamesByType : this.singletonBeanNamesByType);
        String[] resolvedBeanNames = cache.get(type);
        if (resolvedBeanNames != null) {
            return resolvedBeanNames;
        }
        resolvedBeanNames = doGetBeanNamesForType(ResolvableType.forRawClass(type), includeNonSingletons, true);
        if (ClassUtils.isCacheSafe(type, getBeanClassLoader())) {
            cache.put(type, resolvedBeanNames);
        }
        return resolvedBeanNames;
    }

  《《《《《

在 DefaultApplicationContext 类中:

private String[] doGetBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit) {
        List<String> result = new ArrayList<>();

        // Check all bean definitions.
        for (String beanName : this.beanDefinitionNames) {   // 遍历一个存储了所有 beanName的list型的变量, 什么时候将beanName存储进去的??
            // Only consider bean as eligible if the bean name is not defined as alias for some other bean.
            if (!isAlias(beanName)) {   // 如果这个beanName 没有别名
                try {
// 1 得到 RootBeanDefinition RootBeanDefinition mbd
= getMergedLocalBeanDefinition(beanName); // // Only check bean definition if it is complete. if (!mbd.isAbstract() && (allowEagerInit || (mbd.hasBeanClass() || !mbd.isLazyInit() || isAllowEagerClassLoading()) && !requiresEagerInitForType(mbd.getFactoryBeanName()))) { boolean isFactoryBean = isFactoryBean(beanName, mbd); BeanDefinitionHolder dbd = mbd.getDecoratedDefinition(); boolean matchFound = false; boolean allowFactoryBeanInit = (allowEagerInit || containsSingleton(beanName)); boolean isNonLazyDecorated = (dbd != null && !mbd.isLazyInit()); if (!isFactoryBean) { if (includeNonSingletons || isSingleton(beanName, mbd, dbd)) { matchFound = isTypeMatch(beanName, type, allowFactoryBeanInit); } } else { if (includeNonSingletons || isNonLazyDecorated || (allowFactoryBeanInit && isSingleton(beanName, mbd, dbd))) { matchFound = isTypeMatch(beanName, type, allowFactoryBeanInit); } if (!matchFound) { // In case of FactoryBean, try to match FactoryBean instance itself next. beanName = FACTORY_BEAN_PREFIX + beanName; matchFound = isTypeMatch(beanName, type, allowFactoryBeanInit); } } if (matchFound) { result.add(beanName); } } } catch (CannotLoadBeanClassException | BeanDefinitionStoreException ex) { if (allowEagerInit) { throw ex; } // Probably a placeholder: let's ignore it for type matching purposes. LogMessage message = (ex instanceof CannotLoadBeanClassException ? LogMessage.format("Ignoring bean class loading failure for bean '%s'", beanName) : LogMessage.format("Ignoring unresolvable metadata in bean definition '%s'", beanName)); logger.trace(message, ex); // Register exception, in case the bean was accidentally unresolvable. onSuppressedException(ex); } catch (NoSuchBeanDefinitionException ex) { // Bean definition got removed while we were iterating -> ignore. } } } // Check manually registered singletons too. for (String beanName : this.manualSingletonNames) { try { // In case of FactoryBean, match object created by FactoryBean. if (isFactoryBean(beanName)) { if ((includeNonSingletons || isSingleton(beanName)) && isTypeMatch(beanName, type)) { result.add(beanName); // Match found for this bean: do not match FactoryBean itself anymore. continue; } // In case of FactoryBean, try to match FactoryBean itself next. beanName = FACTORY_BEAN_PREFIX + beanName; } // Match raw bean instance (might be raw FactoryBean). if (isTypeMatch(beanName, type)) { result.add(beanName); } } catch (NoSuchBeanDefinitionException ex) { // Shouldn't happen - probably a result of circular reference resolution... logger.trace(LogMessage.format( "Failed to check manually registered singleton with name '%s'", beanName), ex); } } return StringUtils.toStringArray(result); }

 

AbstractBeanFactory 中的 getMergedLocalBeanDefinition。  保证返回的就是一个 RootBeanDefinition 类型的对象。

   protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {
        // Quick check on the concurrent map first, with minimal locking.
        RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName);  // 有一个 Map型的变量专门用来存储 MergedBeanDefinition
        if (mbd != null && !mbd.stale) {    
            return mbd;
        }
// 第一个参数是 beanName ; 第二个参数是 BeanDefinition
return getMergedBeanDefinition(beanName, getBeanDefinition(beanName)); // 如果map中不存在,那么创建一个 MergedBeanDefinition }

// 创建         根据 beanName 和  beanName对应的 BeanDefinition,  来获取 RootBeanDefinition

    其实就是将 BeanDefinition 转换为了 RootBeanDefinition.

/**
     * Return a RootBeanDefinition for the given bean, by merging with the
     * parent if the given bean's definition is a child bean definition.
     * @param beanName the name of the bean definition
     * @param bd the original bean definition (Root/ChildBeanDefinition)
     * @param containingBd the containing bean definition in case of inner bean,
     * or {@code null} in case of a top-level bean
     * @return a (potentially merged) RootBeanDefinition for the given bean
     * @throws BeanDefinitionStoreException in case of an invalid bean definition
     */
     protected RootBeanDefinition getMergedBeanDefinition(
            String beanName, BeanDefinition bd, @Nullable BeanDefinition containingBd)
            throws BeanDefinitionStoreException {

        synchronized (this.mergedBeanDefinitions) {
            RootBeanDefinition mbd = null;
            RootBeanDefinition previous = null;

            // Check with full lock now in order to enforce the same merged instance.
            if (containingBd == null) {   // 为 null
                mbd = this.mergedBeanDefinitions.get(beanName);  //  mdb为 null
            }

            if (mbd == null || mbd.stale) {
                previous = mbd;
                if (bd.getParentName() == null) {   // parentName 变量的作用是什么??  <<<<   如果不存在父定义
                    // Use copy of given root bean definition.
                    if (bd instanceof RootBeanDefinition) {   // 如果该beanDefinition 是 RootBeanDefinition 的类型
                        mbd = ((RootBeanDefinition) bd).cloneBeanDefinition();    //  通过克隆,创建一个新的 RootBeanDefinition
                    }
                    else {
// 如果 该BeanDefiniton 不是 RootBeanDefinition的类型,那么根据当前的 beanDefinition 去创建一个 RootBeanDefinition mbd
= new RootBeanDefinition(bd); } } else { // 如果当前 beanDefinition存在 父定义 // Child bean definition: needs to be merged with parent. BeanDefinition pbd; try {
// 获取父定义的 beanName. String parentBeanName
= transformedBeanName(bd.getParentName()); // 1.1
// 如果 父定义的 beanName和当前的 beanName 不一致
if (!beanName.equals(parentBeanName)) { pbd = getMergedBeanDefinition(parentBeanName); // 1.2 } else {
// 获取 父BeanFactory BeanFactory parent
= getParentBeanFactory();
//
if (parent instanceof ConfigurableBeanFactory) {
// 通过父BeanFactory获取 父定义的 MergerdBeanDefinition pbd
= ((ConfigurableBeanFactory) parent).getMergedBeanDefinition(parentBeanName); } else { throw new NoSuchBeanDefinitionException(parentBeanName, "Parent name '" + parentBeanName + "' is equal to bean name '" + beanName + "': cannot be resolved without a ConfigurableBeanFactory parent"); } } } catch (NoSuchBeanDefinitionException ex) { throw new BeanDefinitionStoreException(bd.getResourceDescription(), beanName, "Could not resolve parent bean definition '" + bd.getParentName() + "'", ex); } // Deep copy with overridden values.

mbd = new RootBeanDefinition(pbd); // 使用父定义来创建 RootBeanDefinition mbd.overrideFrom(bd); // 使用当前 BeanDefinition 去覆盖父定义 } // Set default singleton scope, if not configured before.
// 如果没有配置scope ,则设置成默认的单例模式
if (!StringUtils.hasLength(mbd.getScope())) { mbd.setScope(SCOPE_SINGLETON); } // A bean contained in a non-singleton bean cannot be a singleton itself. // Let's correct this on the fly here, since this might be the result of // parent-child merging for the outer bean, in which case the original inner bean // definition will not have inherited the merged outer bean's singleton status.

// 如果 containingBd不为空,并且 containingBd不是单例的,那么mbd就不能是单例的。 if (containingBd != null && !containingBd.isSingleton() && mbd.isSingleton()) { mbd.setScope(containingBd.getScope()); } // Cache the merged bean definition for the time being // (it might still get re-merged later on in order to pick up metadata changes)
// 缓存,之后可以直接使用
if (containingBd == null && isCacheBeanMetadata()) { this.mergedBeanDefinitions.put(beanName, mbd); } } if (previous != null) { copyRelevantMergedBeanDefinitionCaches(previous, mbd); } return mbd; } }

 1.1  transformedBeanName 做的主要就是去掉开头的 & , 和 解析别名。

   protected String transformedBeanName(String name) {
        return canonicalName(BeanFactoryUtils.transformedBeanName(name));
    }

BeanFactoryUtils中的方法:

public static String transformedBeanName(String name) {
        Assert.notNull(name, "'name' must not be null");
        if (!name.startsWith(BeanFactory.FACTORY_BEAN_PREFIX)) {   // 如果 name 不是以 & 开头的,则直接返回 name
            return name;
        }
        return transformedBeanNameCache.computeIfAbsent(name, beanName -> {   // 如果是,则去掉开头的 & 
            do {
                beanName = beanName.substring(BeanFactory.FACTORY_BEAN_PREFIX.length());
            }
            while (beanName.startsWith(BeanFactory.FACTORY_BEAN_PREFIX));
            return beanName;
        });
    }

SimpleAliasRegistry 中的方法:

/**
     * Determine the raw name, resolving aliases to canonical names.
     * @param name the user-specified name
     * @return the transformed name
     */
    public String canonicalName(String name) {
        String canonicalName = name;
        // Handle aliasing...
        String resolvedName;
        do {
// 如果是别名,则解析成真正的 beanName resolvedName
= this.aliasMap.get(canonicalName); if (resolvedName != null) { canonicalName = resolvedName; } } while (resolvedName != null); return canonicalName; }

 1.2 

    @Override
    public BeanDefinition getMergedBeanDefinition(String name) throws BeansException {
// 获取真正的 beanName String beanName
= transformedBeanName(name); // Efficiently check whether bean definition exists in this factory.

// 如果当前 BeanFactory 中不存在beanName的 Bean定义 && 父 BeanFactory 是 ConfigurableBeanFactory if (!containsBeanDefinition(beanName) && getParentBeanFactory() instanceof ConfigurableBeanFactory) {
// 调用父 beanFactory 去获取 beanName 的 MergedBeanDefinition
return ((ConfigurableBeanFactory) getParentBeanFactory()).getMergedBeanDefinition(beanName); } // Resolve merged bean definition locally.

// 在当前BeanFactory 中解析 beanName 的 MergedBeanDefinition return getMergedLocalBeanDefinition(beanName); }

父 BeanFactory.

  在 Spring 中可能存在多个 BeanFactory,多个 BeanFactory 可能存在 “父工厂” 与 “子工厂” 的关系。最常见的例子就是:Spring MVC 的 BeanFactory 和 Spring 的 BeanFactory,通常情况下,Spring 的 BeanFactory 是 “父工厂”,Spring MVC 的 BeanFactory 是 “子工厂”,在 Spring 中,子工厂可以使用父工厂的 BeanDefinition,因而,如果在当前 BeanFactory 中找不到,而又存在父工厂,则会去父工厂中查找。

 

 

MergedBeanDefinition:  合并的bean定义       合并是因为 存在 ”自定义“ 和 ”父定义“ 的情况。 对于一个Bean的定义,存在下面几种情况:

1) 该BeanDefinition存在  ”父定义“ ,首先使用 ”父定义“的参数构建一个RootBeanDefinition, 然后再使用 该 BeanDefinition的参数来进行覆盖。

2)该BeanDefinition不存在 ”父定义“, 并且该 BeanDefinition 的类型是 RootBeanDefinition ,   则直接返回 RootBeanDefinition 的一个克隆

3) 该BeanDefinition不存在 ”父定义“, 但该 BeanDefinition 的类型不是 RootBeanDefinition ,使用该 BeanDefinition的参数构建一个RootBeanDefiniton.

  通常 BeanDefinition 在之间加载到 BeanFactory中的时候,通常是被封装成 GeniricBeanDefinition 或者 ScannedGenericBeanDefiniton. 前者是通过XML配置来注册的bean, 后者是通过注解的方式注册的bean.  在这里都会被转换成 RootBeanDefinition, 因为后续的操作都是针对RootBeanDefinition来的。

  我们通常遇到的是上面的第三种情形。  

 

 

 

 

问题2: 什么时候将beanName的信息添加到beanFactory的list变量中的??

 

参考文档:

  https://blog.csdn.net/v123411739/article/details/87907784

posted @ 2020-11-30 16:40  你眼里的星辰  阅读(82)  评论(0)    收藏  举报