美文网首页Spring相关时序图系列
Spring IOC(7)DefaultListableBean

Spring IOC(7)DefaultListableBean

作者: 涣涣虚心0215 | 来源:发表于2021-01-01 00:45 被阅读0次
    DefaultListableBeanFactory继承关系

    从图上看,BeanFactory的最终实现类就是DefaultListableBeanFactory。

    DefaultListableBeanFactory

    从成员变量定义来看,它主要提供了存储beanDefinitionMap的容器,在registerBeanDefinition的时候会把BeanDefinition注册到beanDefinitionMap里面。
    另外最主要的方法是resolveDependency的实现,跟autowire candidate相关。

    /** Resolver to use for checking if a bean definition is an autowire candidate. */
    //这个是比较重要的,用来检测BeanDefinition是不是一个autowire candidate
    private AutowireCandidateResolver autowireCandidateResolver = new SimpleAutowireCandidateResolver();
    
    /** Map from dependency type to corresponding autowired value. */
    //class与相关的dependency的关系
    private final Map<Class<?>, Object> resolvableDependencies = new ConcurrentHashMap<>(16);
    
    /** Map of bean definition objects, keyed by bean name. */
    //重要,BeanDefinition的缓存
    private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
    
    /** Map of singleton and non-singleton bean names, keyed by dependency type. */
    //根据bean class缓存所有的beanNames
    private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64);
    
    /** Map of singleton-only bean names, keyed by dependency type. */
    //仅仅是单例的缓存
    private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<>(64);
    
    /** List of bean definition names, in registration order. */
    //所有的BeanDefinition名字的list
    private volatile List<String> beanDefinitionNames = new ArrayList<>(256);
    
    /** List of names of manually registered singletons, in registration order. */
    //所有手动注册的单例beanName的set
    private volatile Set<String> manualSingletonNames = new LinkedHashSet<>(16);
    
    /** Cached array of bean definition names in case of frozen configuration. */
    //所有frozen的BeanDefinition
    private volatile String[] frozenBeanDefinitionNames;
    
    /** Whether bean definition metadata may be cached for all beans. */
    private volatile boolean configurationFrozen = false;       
    

    在使用XML的情况下,如果使用了<context:annotation-config/>,在parse配置文件会通过beanDefinitionReader.parseCustomElement()来增加BeanFactory的功能。
    AutowireCandidateResolver就是在这里被设置。

    <context:annotation-config/>
    <context:component-scan base-package="com.gpcoding" />
    

    NOTE:annotation-config(component-scan同作用) 作用就是启动spring的一些注解,主要会向Spring 容器注册如下4个BeanPostProcessor。
    AutowiredAnnotationBeanPostProcessor @Autowired注解
    CommonAnnotationBeanPostProcessor @ Resource 、@ PostConstruct、@ PreDestroy
    PersistenceAnnotationBeanPostProcessor @PersistenceContext注解
    RequiredAnnotationBeanPostProcessor 这 @Required的注解

    源码解析

    从类图上看DefaultListableBeanFactory已经是Spring为BeanFactory提供的最终实现了,所以它里面很大部分代码都是接口以及抽象类的实现。

    BeanFactory的相关实现

    提供了很多获取bean, beanName, beanDefinition的相关实现。

    image.png
    BeanDefinitionRegistry相关实现

    BeanDefinitionRegistry提供了一个类似BeanDefinition数据库的功能,可以registerBeanDefinition,removeBeanDefinition,以及判断是否containsBeanDefinition等功能。
    主要分析一下registerBeanDefinition:

    @Override
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
            throws BeanDefinitionStoreException {
    
        Assert.hasText(beanName, "Bean name must not be empty");
        Assert.notNull(beanDefinition, "BeanDefinition must not be null");
            //如果是AbstractBeanDefinition,就进行验证
        if (beanDefinition instanceof AbstractBeanDefinition) {
            try {
                ((AbstractBeanDefinition) beanDefinition).validate();
            }
            catch (BeanDefinitionValidationException ex) {
                throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
                        "Validation of bean definition failed", ex);
            }
        }
        //从beanDefinitionMap缓存中获取BeanDefinition
        BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
        if (existingDefinition != null) {
            //如果不允许BeanDefinitionOverriding,就报错
            if (!isAllowBeanDefinitionOverriding()) {
                throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
            }
            else if (existingDefinition.getRole() < beanDefinition.getRole()) {
                // e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTURE
                if (logger.isInfoEnabled()) {
                    logger.info("Overriding user-defined bean definition for bean '" + beanName +
                            "' with a framework-generated bean definition: replacing [" +
                            existingDefinition + "] with [" + beanDefinition + "]");
                }
            }
            else if (!beanDefinition.equals(existingDefinition)) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Overriding bean definition for bean '" + beanName +
                            "' with a different definition: replacing [" + existingDefinition +
                            "] with [" + beanDefinition + "]");
                }
            }
            else {
                if (logger.isTraceEnabled()) {
                    logger.trace("Overriding bean definition for bean '" + beanName +
                            "' with an equivalent definition: replacing [" + existingDefinition +
                            "] with [" + beanDefinition + "]");
                }
            }
            //上面验证过了,就重新存入beanDefinitionMap缓存
            this.beanDefinitionMap.put(beanName, beanDefinition);
        }
        else {  
            //如果已经开始createBean了,就需要Synchronized加锁,然后更新缓存
            if (hasBeanCreationStarted()) {
                // Cannot modify startup-time collection elements anymore (for stable iteration)
                synchronized (this.beanDefinitionMap) {
                    this.beanDefinitionMap.put(beanName, beanDefinition);
                    List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);
                    updatedDefinitions.addAll(this.beanDefinitionNames);
                    updatedDefinitions.add(beanName);
                    this.beanDefinitionNames = updatedDefinitions;
                    if (this.manualSingletonNames.contains(beanName)) {
                        Set<String> updatedSingletons = new LinkedHashSet<>(this.manualSingletonNames);
                        updatedSingletons.remove(beanName);
                        this.manualSingletonNames = updatedSingletons;
                    }
                }
            }
            //如果还没开始有bean生成,就直接更新缓存
            else {
                // Still in startup registration phase
                this.beanDefinitionMap.put(beanName, beanDefinition);
                this.beanDefinitionNames.add(beanName);
                this.manualSingletonNames.remove(beanName);
            }
            this.frozenBeanDefinitionNames = null;
        }
        //如果beanDefinition已经存在,或者已经存在singleton的bean了,
        //就根据提供的beanName,reset所有BeanDefinition的缓存
        if (existingDefinition != null || containsSingleton(beanName)) {
            resetBeanDefinition(beanName);
        }
    }   
    
    SingletonBeanRegistry相关实现

    DefaultListableBeanFactory同样对顶层接口SingletonBeanRegistry进行了实现。
    SingletonBeanRegistry与BeanDefinitionRegistry类似,也是提供了对singleton bean的数据库功能,比如getSingleton, containsSingleton, registerSingleton。它有一个默认的实现DefaultSingletonBeanRegistry。

    /** Cache of singleton objects: bean name to bean instance. */
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
    /** Cache of singleton factories: bean name to ObjectFactory. */
    private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
    /** Cache of early singleton objects: bean name to bean instance. */
    private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
    /** Set of registered singletons, containing the bean names in registration order. */
    private final Set<String> registeredSingletons = new LinkedHashSet<>(256);
    /** Names of beans that are currently in creation. */
    private final Set<String> singletonsCurrentlyInCreation =
            Collections.newSetFromMap(new ConcurrentHashMap<>(16));
    /** Names of beans currently excluded from in creation checks. */
    private final Set<String> inCreationCheckExclusions =
            Collections.newSetFromMap(new ConcurrentHashMap<>(16));
    /** List of suppressed Exceptions, available for associating related causes. */
    @Nullable
    private Set<Exception> suppressedExceptions;
    /** Flag that indicates whether we're currently within destroySingletons. */
    private boolean singletonsCurrentlyInDestruction = false;
    /** Disposable bean instances: bean name to disposable instance. */
    private final Map<String, Object> disposableBeans = new LinkedHashMap<>();
    /** Map between containing bean names: bean name to Set of bean names that the bean contains. */
    private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<>(16);
    /** Map between dependent bean names: bean name to Set of dependent bean names. */
    private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<>(64);
    /** Map between depending bean names: bean name to Set of bean names for the bean's dependencies. */
    private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<>(64);
    
    

    DefaultSingletonBeanRegistry里面提供了各种singleton bean的缓存,这里也有比较经典的三级缓存解决bean循环依赖实现。
    另外也有disposableBeans,dependentBeanMap这些缓存,可以通过registerDependentBean(),registerDisposableBean()来添加缓存。
    这里主要还是看跟singleton bean相关的方法:

    //将singleton bean加入singletonObjects缓存
    public void registerSingleton(String beanName, Object singletonObject) throws IllegalStateException {
        Assert.notNull(beanName, "Bean name must not be null");
        Assert.notNull(singletonObject, "Singleton object must not be null");
        synchronized (this.singletonObjects) {
            //判断singletonObjects缓存是否存在该bean,如果存在报错
            Object oldObject = this.singletonObjects.get(beanName);
            if (oldObject != null) {
                throw new IllegalStateException("Could not register object [" + singletonObject +
                        "] under bean name '" + beanName + "': there is already object [" + oldObject + "] bound");
            } 
            //如果不存在就开始添加缓存
            addSingleton(beanName, 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);
        }
    }
    //核心方法,解决bean循环依赖的核心代码
    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
        //先获取一级缓存
        Object singletonObject = this.singletonObjects.get(beanName);
        //如果一级缓存为空,且当前singleton bean正在创建,则表示有循环依赖
        if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
            synchronized (this.singletonObjects) {
                //从earlySingletonObjects获取二级缓存
                singletonObject = this.earlySingletonObjects.get(beanName);
                //如果二级缓存为空,且allowEarlyReference为true
                if (singletonObject == null && allowEarlyReference) {
                    //从singletonFactories三级缓存中获取
                    ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                    if (singletonFactory != null) {
                       //如果三级缓存不为空,则从三级缓存中获取singletonObject,放入二级缓存,同时删除三级缓存。
                        singletonObject = singletonFactory.getObject();
                        this.earlySingletonObjects.put(beanName, singletonObject);
                        this.singletonFactories.remove(beanName);
                    }
                }
            }
        }
        return singletonObject;
    }
    //添加三级缓存
    protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
        Assert.notNull(singletonFactory, "Singleton factory must not be null");
        synchronized (this.singletonObjects) {
            if (!this.singletonObjects.containsKey(beanName)) {
                //放入三级缓存
                this.singletonFactories.put(beanName, singletonFactory);
                //删除二级缓存
                this.earlySingletonObjects.remove(beanName);
                this.registeredSingletons.add(beanName);
            }
        }
    }   
    //核心方法,获取singleton,提供singletonFactory生成singleton bean
    public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
        Assert.notNull(beanName, "Bean name must not be null");
        synchronized (this.singletonObjects) {
            Object singletonObject = this.singletonObjects.get(beanName);
            if (singletonObject == null) {
                if (this.singletonsCurrentlyInDestruction) {
                    throw new BeanCreationNotAllowedException(beanName,
                            "Singleton bean creation not allowed while singletons of this factory are in destruction " +
                            "(Do not request a bean from a BeanFactory in a destroy method implementation!)");
                }
                if (logger.isDebugEnabled()) {
                    logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
                }
                //singletonFactory.getObject()之前,添加到singletonsCurrentlyInCreation
                beforeSingletonCreation(beanName);
                boolean newSingleton = false;
                boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
                if (recordSuppressedExceptions) {
                    this.suppressedExceptions = new LinkedHashSet<>();
                }
                try {
                    //通过singletonFactory获取到singleton bean
                    singletonObject = singletonFactory.getObject();
                    newSingleton = true;
                }
                catch (IllegalStateException ex) {
                    // Has the singleton object implicitly appeared in the meantime ->
                    // if yes, proceed with it since the exception indicates that state.
                    singletonObject = this.singletonObjects.get(beanName);
                    if (singletonObject == null) {
                        throw ex;
                    }
                }
                catch (BeanCreationException ex) {
                    if (recordSuppressedExceptions) {
                        for (Exception suppressedException : this.suppressedExceptions) {
                            ex.addRelatedCause(suppressedException);
                        }
                    }
                    throw ex;
                }
                finally {
                    if (recordSuppressedExceptions) {
                        this.suppressedExceptions = null;
                    }
                    //bean创建之后调用从singletonsCurrentlyInCreation移除
                    afterSingletonCreation(beanName);
                }
                if (newSingleton) {
                    addSingleton(beanName, singletonObject);
                }
            }
            return singletonObject;
        }
    }
    
    AutowireCapableBeanFactory相关实现

    前面提过AutowireCapableBeanFactory主要跟bean的autowire以及beanPostProcessor调用实现有关。
    同时上面提到@Autowired以及@Value注解会通过AutowiredAnnotationBeanPostProcessor来进行处理,AutowiredAnnotationBeanPostProcessor里面会通过beanFactory.resolveDependency()获得dependency的bean然后通过反射field.set()来inject autowire的属性(后续分析)。

    @Override
    @Nullable
    public Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,
            @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {
            。。。
            if (result == null) {
                result = doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter);
            }
            return result;
        }
    }
    @Nullable
    public Object doResolveDependency(DependencyDescriptor descriptor, @Nullable String beanName,
            @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {
    
        InjectionPoint previousInjectionPoint = ConstructorResolver.setCurrentInjectionPoint(descriptor);
        try {
            Object shortcut = descriptor.resolveShortcut(this);
            if (shortcut != null) {
                return shortcut;
            }
    
            Class<?> type = descriptor.getDependencyType();
            //通过AutowireCandidateResolver(获取建议的Value
            Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);
            if (value != null) {
                //如果Value不为空,且是string类型,则通过beanExpressionResolver来解析string内容
                if (value instanceof String) {
                    String strVal = resolveEmbeddedValue((String) value);
                    BeanDefinition bd = (beanName != null && containsBean(beanName) ? getMergedBeanDefinition(beanName) : null);
                    value = evaluateBeanDefinitionString(strVal, bd);
                }
                //如果不是string,就需要通过TypeConverter来进行类型转换
                TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
                return (descriptor.getField() != null ?
                        converter.convertIfNecessary(value, type, descriptor.getField()) :
                        converter.convertIfNecessary(value, type, descriptor.getMethodParameter()));
            }
    
            Object multipleBeans = resolveMultipleBeans(descriptor, beanName, autowiredBeanNames, typeConverter);
            if (multipleBeans != null) {
                return multipleBeans;
            }
            //根据type去查找bean,有可能是真正的bean,也有可能是bean对应的class对象
            Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor);
            if (matchingBeans.isEmpty()) {
                if (isRequired(descriptor)) {
                    raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);
                }
                return null;
            }
    
            String autowiredBeanName;
            Object instanceCandidate;
    
            if (matchingBeans.size() > 1) {
                //如果找到多个matchingbean,则需要找到正确的beanName,通过beanName去获取真正的bean
                autowiredBeanName = determineAutowireCandidate(matchingBeans, descriptor);
                if (autowiredBeanName == null) {
                    if (isRequired(descriptor) || !indicatesMultipleBeans(type)) {
                        return descriptor.resolveNotUnique(descriptor.getResolvableType(), matchingBeans);
                    }
                    else {
                        // In case of an optional Collection/Map, silently ignore a non-unique case:
                        // possibly it was meant to be an empty collection of multiple regular beans
                        // (before 4.3 in particular when we didn't even look for collection beans).
                        return null;
                    }
                }
                instanceCandidate = matchingBeans.get(autowiredBeanName);
            }
            else {
                // We have exactly one match.
                Map.Entry<String, Object> entry = matchingBeans.entrySet().iterator().next();
                autowiredBeanName = entry.getKey();
                instanceCandidate = entry.getValue();
            }
    
            if (autowiredBeanNames != null) {
                autowiredBeanNames.add(autowiredBeanName);
            }
            //如果instanceCandidate是class类型,再通过resolveCandidate,即BeanFactory.getBean()去生成所需要的bean
            if (instanceCandidate instanceof Class) {
                instanceCandidate = descriptor.resolveCandidate(autowiredBeanName, type, this);
            }
            Object result = instanceCandidate;
            if (result instanceof NullBean) {
                if (isRequired(descriptor)) {
                    raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);
                }
                result = null;
            }
            if (!ClassUtils.isAssignableValue(type, result)) {
                throw new BeanNotOfRequiredTypeException(autowiredBeanName, type, instanceCandidate.getClass());
            }
            return result;
        }
        finally {
            ConstructorResolver.setCurrentInjectionPoint(previousInjectionPoint);
        }
    }
    //查找符合requiredType类型的bean
    protected Map<String, Object> findAutowireCandidates(
            @Nullable String beanName, Class<?> requiredType, DependencyDescriptor descriptor) {
        //通过BeanFactory来确定type对应的bean name
        String[] candidateNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
                this, requiredType, true, descriptor.isEager());
    
        Map<String, Object> result = new LinkedHashMap<>(candidateNames.length);
        //从resolvableDependencies里查找bean
        for (Map.Entry<Class<?>, Object> classObjectEntry : this.resolvableDependencies.entrySet()) {
            Class<?> autowiringType = classObjectEntry.getKey();
            if (autowiringType.isAssignableFrom(requiredType)) {
                Object autowiringValue = classObjectEntry.getValue();
                autowiringValue = AutowireUtils.resolveAutowiringValue(autowiringValue, requiredType);
                if (requiredType.isInstance(autowiringValue)) {
                    result.put(ObjectUtils.identityToString(autowiringValue), autowiringValue);
                    break;
                }
            }
        }
        //如果resolvableDependencies没有match的bean
        for (String candidate : candidateNames) {
            //isSelfReference检查是不是子引用的,isAutowireCandidate判断candidate对应的bean是不是
            if (!isSelfReference(beanName, candidate) && isAutowireCandidate(candidate, descriptor)) {
                //获取candidate对应的bean,并放入result中
                addCandidateEntry(result, candidate, descriptor, requiredType);
            }
        }
        if (result.isEmpty()) {
            boolean multiple = indicatesMultipleBeans(requiredType);
            // Consider fallback matches if the first pass failed to find anything...
            DependencyDescriptor fallbackDescriptor = descriptor.forFallbackMatch();
            for (String candidate : candidateNames) {
                if (!isSelfReference(beanName, candidate) && isAutowireCandidate(candidate, fallbackDescriptor) &&
                        (!multiple || getAutowireCandidateResolver().hasQualifier(descriptor))) {
                    addCandidateEntry(result, candidate, descriptor, requiredType);
                }
            }
            if (result.isEmpty() && !multiple) {
                // Consider self references as a final pass...
                // but in the case of a dependency collection, not the very same bean itself.
                for (String candidate : candidateNames) {
                    if (isSelfReference(beanName, candidate) &&
                            (!(descriptor instanceof MultiElementDescriptor) || !beanName.equals(candidate)) &&
                            isAutowireCandidate(candidate, fallbackDescriptor)) {
                        addCandidateEntry(result, candidate, descriptor, requiredType);
                    }
                }
            }
        }
        return result;
    }
    //将通过candidateName对应的bean的实例或者class对象放入candidates map对象里
    private void addCandidateEntry(Map<String, Object> candidates, String candidateName,
            DependencyDescriptor descriptor, Class<?> requiredType) {
    
        if (descriptor instanceof MultiElementDescriptor) {
            Object beanInstance = descriptor.resolveCandidate(candidateName, requiredType, this);
            if (!(beanInstance instanceof NullBean)) {
                candidates.put(candidateName, beanInstance);
            }
        }
        //如果已经存在singleton的bean,则通过getBean()方法直接获取
        else if (containsSingleton(candidateName) || (descriptor instanceof StreamDependencyDescriptor &&
                ((StreamDependencyDescriptor) descriptor).isOrdered())) {
            //resolveCandidate主要是调用BeanFactory.getBean()获取真正的bean实例
            Object beanInstance = descriptor.resolveCandidate(candidateName, requiredType, this);
            candidates.put(candidateName, (beanInstance instanceof NullBean ? null : beanInstance));
        }
        else {
            //如果没有singleton的bean,则放入class对象
            candidates.put(candidateName, getType(candidateName));
        }
    }
    
    ConfigurableListableBeanFactory相关实现

    这个接口里提供了很重要的方法preInstantiateSingletons(),即预实例化非lazy的Singleton bean。

    public void preInstantiateSingletons() throws BeansException {
        if (logger.isTraceEnabled()) {
            logger.trace("Pre-instantiating singletons in " + this);
        }
    
        // Iterate over a copy to allow for init methods which in turn register new bean definitions.
        // While this may not be part of the regular factory bootstrap, it does otherwise work fine.
        List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
    
        // Trigger initialization of all non-lazy singleton beans...
        //根据beanDefinitionNames初始化no-lazy的singleton bean
        for (String beanName : beanNames) {
            RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
            if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
                if (isFactoryBean(beanName)) {
                    //如果是Factorybean,则通过getBean()获取,注意是加了FACTORY_BEAN_PREFIX前缀的
                    Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
                    if (bean instanceof FactoryBean) {
                        final FactoryBean<?> factory = (FactoryBean<?>) bean;
                        boolean isEagerInit;
                        if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                            isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
                                            ((SmartFactoryBean<?>) factory)::isEagerInit,
                                    getAccessControlContext());
                        }
                        else {
                            isEagerInit = (factory instanceof SmartFactoryBean &&
                                    ((SmartFactoryBean<?>) factory).isEagerInit());
                        }
                        if (isEagerInit) {
                            //根据beanName去获取bean
                            getBean(beanName);
                        }
                    }
                }
                else {
                    //根据beanName去获取bean
                    getBean(beanName);
                }
            }
        }
    
        // Trigger post-initialization callback for all applicable beans...
        for (String beanName : beanNames) {
            Object singletonInstance = getSingleton(beanName);
            if (singletonInstance instanceof SmartInitializingSingleton) {
                final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
                if (System.getSecurityManager() != null) {
                    AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                        smartSingleton.afterSingletonsInstantiated();
                        return null;
                    }, getAccessControlContext());
                }
                else {
                    smartSingleton.afterSingletonsInstantiated();
                }
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:Spring IOC(7)DefaultListableBean

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