SpringIOC源码——外部流程与结构
public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            prepareRefresh();//准备一些早期事件和早期监听器以及容器状态的初始化
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();//返回一个bean工厂,用户可以定制自己的工厂或者用默认的
            prepareBeanFactory(beanFactory);//
            try { 
                postProcessBeanFactory(beanFactory);//工厂配置一些基本组件和利用工厂注册一些早期需要的东西
                invokeBeanFactoryPostProcessors(beanFactory);//调用工厂后置处理,实现工厂内部组件的定制,spring有三个内置的工厂后置处理,稍后讲
                registerBeanPostProcessors(beanFactory);//实例化所有实现了后置处理器的bean
                initMessageSource();//国际化
                initApplicationEventMulticaster();//初始化事件一些派发
                onRefresh();//子类实现
                registerListeners();//注册监听器
                /*
                  @重点,开始工厂的工作流程
                 */
                finishBeanFactoryInitialization(beanFactory);
                finishRefresh();
            }

catch (BeansException ex) {
               ……
            }

finally {
                // Reset common introspection caches in Spring's core, since we
                // might not ever need metadata for singleton beans anymore...
                resetCommonCaches();
            }
        }
    }

SpringIOC源码——注册beanPostProcesser
进行一些排序处理以及分类处理

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

String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
        ……
        beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
        ……
        sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
        registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
        ……
        sortPostProcessors(orderedPostProcessors, beanFactory);
        registerBeanPostProcessors(beanFactory, orderedPostProcessors);
         ……
        registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
        ……
        sortPostProcessors(internalPostProcessors, beanFactory);
        registerBeanPostProcessors(beanFactory, internalPostProcessors);
        ……
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
    }

SpringIOC源码——创建bean
finishBeanFactoryInitialization

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
        /*
          value注解解析
         */
        ……
        if (!beanFactory.hasEmbeddedValueResolver()) {
            beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
        }
       ……
       /*
         创建开始
        */
        beanFactory.preInstantiateSingletons();
    }

DefaultListableBeanFactory

public void preInstantiateSingletons() throws BeansException {
        /*
          拿到所有名字
         */
        List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

for (String beanName : beanNames) {
        /*
            将bean信息封装成RootBeanDefinition
            RootBeanDefinition是一个操作bean核心数据的对象
          */
            RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
            if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
                if (isFactoryBean(beanName)) {//isFactoryBean,做一些特殊操作
                    ……
                }
                else {
                    getBean(beanName);//继续深入
                }
            }
        }
        /*
          @实现了SmartInitializingSingleton的创建最后的处理
         */
        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();
                }
            }
        }
    }

AbstractBeanFactory

public Object getBean(String name) throws BeansException {
        return doGetBean(name, null, null, false);
}
protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
            @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
        
        /*
          先去看看缓存看看有没有,三级缓存第二次getBean这里将不返回null
         */
        final String beanName = transformedBeanName(name);
        Object bean;
        Object sharedInstance = getSingleton(beanName);
        if (sharedInstance != null && args == null) {
            ……
            bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
        }

else {//三级都没有则会直接调用createBean继续
           ……
           /*
             如果父类工厂中存在则用父类工厂创建这些信息
            */
            BeanFactory parentBeanFactory = getParentBeanFactory();
            if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
                
            }
            ……

try { 
                /*
                     封装成RootBeanDefinition
                */
                final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
                checkMergedBeanDefinition(mbd, beanName, args);
                 /*
                 检查是否依赖,依赖先创建,会有循环依赖问题,然后递归执行
                 */
                String[] dependsOn = mbd.getDependsOn();
                if (dependsOn != null) {
                    for (String dep : dependsOn) {
                        if (isDependent(beanName, dep)) {
                            throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                                    "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                        }
                        registerDependentBean(dep, beanName);
                        try {
                            getBean(dep);
                        }
                        catch (NoSuchBeanDefinitionException ex) {
                            throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                                    "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
                        }
                    }
                }

/*
                  单列bean处理
                 */
                if (mbd.isSingleton()) {
                    sharedInstance = getSingleton(beanName, () -> {
                        try {
                            return createBean(beanName, mbd, args);
                        }
                        catch (BeansException ex) {
                            destroySingleton(beanName);
                            throw ex;
                        }
                    });
                    bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
                }
                /*
                  多列bean处理
                 */
                else if (mbd.isPrototype()) {
                    Object prototypeInstance = null;
                    try {
                        beforePrototypeCreation(beanName);
                        prototypeInstance = createBean(beanName, mbd, args);
                    }
                    finally {
                        afterPrototypeCreation(beanName);
                    }
                    bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
                }
                /*
                  作用域bean处理
                 */
                else {
                    String scopeName = mbd.getScope();
                    final Scope scope = this.scopes.get(scopeName);
                    if (scope == null) {
                        throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
                    }
                    try {
                        Object scopedInstance = scope.get(beanName, () -> {
                            beforePrototypeCreation(beanName);
                            try {
                                return createBean(beanName, mbd, args);
                            }
                            finally {
                                afterPrototypeCreation(beanName);
                            }
                        });
                        bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
                    }
                    catch (IllegalStateException ex) {
                        throw new BeanCreationException(beanName,
                                "Scope '" + scopeName + "' is not active for the current thread; consider " +
                                "defining a scoped proxy for this bean if you intend to refer to it from a singleton",
                                ex);
                    }
                }
            }
            catch (BeansException ex) {
                cleanupAfterBeanCreationFailure(beanName);
                throw ex;
            }
        }
      ……
        return (T) bean;
}

AbstractAutowireCapableBeanFactory——createBean

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

……
        /*
           解析class注入RootBeanDefinition中
         */
        RootBeanDefinition mbdToUse = mbd;
        Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
        if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
            mbdToUse = new RootBeanDefinition(mbd);
            mbdToUse.setBeanClass(resolvedClass);
        }
        try {
            /*
               代理模式的返回
             */
            Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
            if (bean != null) {
                return bean;
            }
        }
        catch (Throwable ex) {
            throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
                    "BeanPostProcessor before instantiation of bean failed", ex);
        }

try {
            /*
              开始创建
             */
            Object beanInstance = doCreateBean(beanName, mbdToUse, args);
            if (logger.isTraceEnabled()) {
                logger.trace("Finished creating instance of bean '" + beanName + "'");
            }
            return beanInstance;
        }
        catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
            throw ex;
        }
        catch (Throwable ex) {
            throw new BeanCreationException(
                    mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
        }
}

AbstractAutowireCapableBeanFactory——doCreateBean

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
            throws BeanCreationException {
        BeanWrapper instanceWrapper = null;
        /*
          @创建实例,优先调用无参构造器
         */.
        if (mbd.isSingleton()) {
            instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
        }
        if (instanceWrapper == null) {
            instanceWrapper = createBeanInstance(beanName, mbd, args);
        }
        final Object bean = instanceWrapper.getWrappedInstance();
        Class<?> beanType = instanceWrapper.getWrappedClass();
        if (beanType != NullBean.class) {
            mbd.resolvedTargetType = beanType;
        }

/*
          @MergedBeanDefinitionPostProcessors
         */.
        synchronized (mbd.postProcessingLock) {
            if (!mbd.postProcessed) {
                try {
                    applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
                }
                catch (Throwable ex) {
                    throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                            "Post-processing of merged bean definition failed", ex);
                }
                mbd.postProcessed = true;
            }
        }
       /*
        * 这里开始提前暴露引用,加入三级缓存,但是只是加入一个工厂返回bean
        */
        boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
                isSingletonCurrentlyInCreation(beanName));
        if (earlySingletonExposure) {
            if (logger.isTraceEnabled()) {
                logger.trace("Eagerly caching bean '" + beanName +
                        "' to allow for resolving potential circular references");
            }
            addSingletonFactory(beanName, () ->              getEarlyBeanReference(beanName, mbd, bean));
        }

Object exposedObject = bean;
        try {
            /*
              赋值的时候可能依赖另外一个bean,继续递归调用getBean方法
             */
            populateBean(beanName, mbd, instanceWrapper);
            /*
             调用ioc意义的初始化方法
             */
            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);
            }
        }

if (earlySingletonExposure) {
            Object earlySingletonReference = getSingleton(beanName, false);
            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);
                        }
                    }
                    if (!actualDependentBeans.isEmpty()) {
                        throw new BeanCurrentlyInCreationException(……)
                    }
                }
            }
        }

/*
           注册需要销毁通知的bean到
         */
        try {
            registerDisposableBeanIfNecessary(beanName, bean, mbd);
        }
        catch (BeanDefinitionValidationException ex) {
            throw new BeanCreationException(
                    mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
        }

return exposedObject;
    }
SpringIOC源码——beanFactory简单api
/*
  registerSingleton是可以对外暴露的api
  最后所有实例对象放入到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) {
            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);
        }
    }
    /*
       用于解决循环引用问题,有一些对象创建在singletonFactories中
     */
    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);
            }
        }
    }
SpringIOC源码——整体流程——总结
(1)初始化期间,我们实现一个父工厂、重建一个工厂、工厂后置处理来实现工厂的行为的改变;
(2)初始化期间,会先实例化所有具有beanpostprocesser的类;
(3)获取bean:AbstractBeanFactory会加载所有定义信息,然后去获取bean;获取不到就会去调用下面的创建bean
(4)创建bean,AbstractAutowireCapableBeanFactory是主要助处理创建bean的类,内置很多postprocesser的调用以及解决循环引用的问题关键还有单利和多例的创建方式

www.mendeley.com/catalogue/18a2b6e5-7430-32a2-8b25-fbb8602565b6/
www.mendeley.com/catalogue/11deddda-a48f-3529-ac68-c6ff2b72db51/
www.mendeley.com/catalogue/6205cc52-b893-3439-9e6f-0e96002d48f6/
www.mendeley.com/catalogue/eeead74b-fe68-3eb3-86e6-5eb7250b64dd/
www.mendeley.com/catalogue/a86cb643-7c4f-3a7e-8a88-bf85b3088cc7/
www.mendeley.com/catalogue/4a586188-884b-3774-a061-53780a898040/
www.mendeley.com/catalogue/e3323f1a-38d0-31fa-aed6-565bd4336733/
www.mendeley.com/catalogue/8c8f37fb-3b70-3719-8281-300f4c67efe6/
www.mendeley.com/catalogue/eaf413c8-e4f6-343e-b994-123abd7ddbd6/
www.mendeley.com/catalogue/d3f1ffc1-9312-30c4-9d21-218fc498292f/
www.mendeley.com/catalogue/d8a4a475-6406-30a5-b100-fe5aa50758bf/
www.mendeley.com/catalogue/65e87635-a23a-322a-ae81-6c4a9957d75f/
www.mendeley.com/catalogue/3292c4ba-227f-3f1c-b9b2-45a2d2eab314/
www.mendeley.com/catalogue/c89345d7-3506-304c-82b0-277c420701f2/
www.mendeley.com/catalogue/0dfbbaff-e979-304a-9d2e-c227bfdc1aa2/
www.mendeley.com/catalogue/1627db18-90f0-38a2-bafd-18cc4b9493d0/
www.mendeley.com/catalogue/7c308eb5-72f5-3e19-9c40-7ddf4050a4a5/
www.mendeley.com/catalogue/914077fc-f953-31e2-bffe-8ea23300d8c2/
www.mendeley.com/catalogue/e8e9d751-9f3b-39b6-a5b1-2bcbd982f4be/
www.mendeley.com/catalogue/a3d12cca-1c26-367e-95d4-4061ce24c754/
www.mendeley.com/catalogue/2351c7fa-ecc1-3433-a599-a529b69bdd30/
www.mendeley.com/catalogue/eb357a8c-537d-3073-9026-52cc80658883/
www.mendeley.com/catalogue/67f2a31d-7584-3497-8375-5d6488c4c3c7/
www.mendeley.com/catalogue/d791cd16-2999-33a8-b265-f98c4419024b/
www.mendeley.com/catalogue/96fc9d03-c93d-33c9-8c30-ae6821fedf75/
www.mendeley.com/catalogue/89d06495-b7ad-3f1e-988e-c5316f849f0d/
www.mendeley.com/catalogue/f13a79df-601b-307c-a94c-2df184081658/
www.mendeley.com/catalogue/602ce90a-9bf3-31a6-9ace-587481d67561/
www.mendeley.com/catalogue/c74d2777-b563-3d4d-856f-0bc9e064582a/
www.mendeley.com/catalogue/df994e50-ba55-3f32-aeb2-e5fe948e86b1/
www.mendeley.com/catalogue/4e3742c8-79af-37ee-af96-75c83541a6aa/
www.mendeley.com/catalogue/1ad69a3c-563b-3fbf-ba62-574dcf7c722f/
www.mendeley.com/catalogue/35da144d-7a47-333f-989a-63f9d4dc40ef/
www.mendeley.com/catalogue/c494d287-4e05-30e0-b46d-a9433d4334c9/
www.mendeley.com/catalogue/f673abea-2701-3071-a6e1-6f4c4c93c696/
www.mendeley.com/catalogue/01ef3a72-ff06-3497-8aab-6099302afc7f/
www.mendeley.com/catalogue/2a6a5415-8e04-3b8e-860d-89110fa8a934/
www.mendeley.com/catalogue/fa53fb9d-9360-3ee3-b051-7ff4259abfb7/
www.mendeley.com/catalogue/8239da17-60d7-3c56-a9ff-c38cbef3fe37/
www.mendeley.com/catalogue/0776513c-545f-36e7-9830-fd51db49a1d7/
www.mendeley.com/catalogue/d913f4ef-ea6f-3132-b03b-50a59ddb88a5/
www.mendeley.com/catalogue/687a4e4a-528f-30ef-a573-0d5757954c29/
www.mendeley.com/catalogue/1c6505f4-8b9a-3df4-b691-16a6ae6ea864/
www.mendeley.com/catalogue/eb76d46c-9b5e-3a69-b214-69a9f3f8ad1e/
www.mendeley.com/catalogue/da4deb38-2b2f-3a83-9ac6-cd96039d24f5/
www.mendeley.com/catalogue/1f580314-2cae-3322-965f-4461a59f79f9/
www.mendeley.com/catalogue/4091199e-f9bd-3c26-bb13-3808631be73a/
www.mendeley.com/catalogue/10746dd5-4d6e-32eb-a246-d8baf3522f82/
www.mendeley.com/catalogue/4e321005-7d2c-3703-a923-42c5285b737a/
www.mendeley.com/catalogue/9e36668e-b14f-33f9-95a7-543c5d6c64e4/
www.mendeley.com/catalogue/60752814-8b04-3a88-9fb4-26e75572e001/
www.mendeley.com/catalogue/73694319-5e1c-32e0-85c3-50d7a3110af4/
www.mendeley.com/catalogue/8aee260d-2ecf-3af1-9180-06a0da8ab844/
www.mendeley.com/catalogue/97b99607-58e6-34a3-8750-f49338bc3104/
www.mendeley.com/catalogue/ca2f5049-cf9a-39ca-b82b-06a3d77085c0/
www.mendeley.com/catalogue/b57c5bce-7055-3acd-982e-9c1e6f541242/
www.mendeley.com/catalogue/fad2a795-61ff-3736-a4c7-84e9243d3dd5/
www.mendeley.com/catalogue/b3020434-1c5d-3829-875d-2500c186e901/
www.mendeley.com/catalogue/4ee1eb76-9301-36d2-a54f-4647c53fbf07/
www.mendeley.com/catalogue/a5797652-2837-3ec9-b813-a50be5aa6267/
www.mendeley.com/catalogue/007e2839-683c-374c-96ac-e109b489e455/
www.mendeley.com/catalogue/b2597739-8b87-3812-9083-8801c6582b13/
www.mendeley.com/catalogue/dd3936a9-d805-3b60-a9a8-cb5bea8a028e/
www.mendeley.com/catalogue/f2dd785d-789b-3811-b156-50d857cf0acc/
www.mendeley.com/catalogue/5ce1570b-c18c-3926-9922-5777c4841dc6/
www.mendeley.com/catalogue/0f0c1f81-19d5-3e2b-8d2b-b753ddad21a9/
www.mendeley.com/catalogue/1a3bbcb5-8622-3c1d-98f6-16f6762df385/
www.mendeley.com/catalogue/a681c4c3-cde3-302f-ad6c-e79655969ba8/
www.mendeley.com/catalogue/762e1635-9d93-31d7-bbd7-dac35842a4d0/
www.mendeley.com/catalogue/45a2cb0f-3f19-350a-9c07-954f46ef644a/
www.mendeley.com/catalogue/3c1b3348-c989-3ec1-894e-2b4d52ecd111/
www.mendeley.com/catalogue/5c0e9f9b-1d8d-39de-b648-34b53e7fc950/
www.mendeley.com/catalogue/3e1011bd-844f-3bfa-89eb-6a54a52cec7e/
www.mendeley.com/catalogue/0667f6a2-333f-3d76-b6c4-5b6874f51d86/
www.mendeley.com/catalogue/a4563efd-6d28-325a-bf84-002f58bc8bc0/
www.mendeley.com/catalogue/dd19f415-ee43-30ef-b511-9b1d194d379e/
www.mendeley.com/catalogue/2b3b6321-9809-353f-a019-48dc5578fe45/
www.mendeley.com/catalogue/379ac198-fac2-36ea-ba06-535336018924/
www.mendeley.com/catalogue/4bf62807-06a6-31bb-b3b8-cb39f3316397/
www.mendeley.com/catalogue/5bfa526f-b389-380e-a18d-b5d71c486521/
www.mendeley.com/catalogue/4c9664b5-d9e6-3cea-aebb-6b90c2f07847/
www.mendeley.com/catalogue/930f1cb8-4596-3da4-909c-8acd9836080c/
www.mendeley.com/catalogue/d3306839-71d9-363a-af63-6dd3c05d6289/
www.mendeley.com/catalogue/85ff48cb-cb76-3968-a172-bad774a9867d/
www.mendeley.com/catalogue/fa081460-947a-31e1-b75b-cd0670020201/
www.mendeley.com/catalogue/357455bd-eef3-3f9a-bcf2-7e33224b4a51/
www.mendeley.com/catalogue/b4e3034f-f164-30eb-8a76-126f01f8f348/
www.mendeley.com/catalogue/a7dd565e-1839-3b2c-8dea-7fe65204ccac/
www.mendeley.com/catalogue/4f80e1ff-bca1-3bfb-8538-6bebcf59218b/
www.mendeley.com/catalogue/5af63315-8130-3ff6-8707-3ed0ae123a7c/
www.mendeley.com/catalogue/7fae178d-221a-3bfe-b5a4-df1b54fe68f4/
www.mendeley.com/catalogue/11be9136-f032-3fd1-a4aa-0daaceb63425/
www.mendeley.com/catalogue/12621a55-5a1e-331a-9049-0008e6271f16/
www.mendeley.com/catalogue/265d73fb-23fc-30dc-a599-980aae317078/
www.mendeley.com/catalogue/2c53ffda-ecd1-3e41-abab-b273aa9d8bf4/
www.mendeley.com/catalogue/744ae279-883a-37f4-9ad1-f7237b6991f2/
www.mendeley.com/catalogue/4b8becc2-4353-32c0-8a0c-957949108f7f/
www.mendeley.com/catalogue/9a9778bf-9682-3ab4-85fe-c6c70f36ea85/
www.mendeley.com/catalogue/a54b3606-78b8-34c4-a711-7044b6837878/
www.mendeley.com/catalogue/4a02ba6e-1019-35aa-b01e-457648a1ac60/
www.mendeley.com/catalogue/d103efe7-17c4-3eee-b882-e9dd1ce270ba/
www.mendeley.com/catalogue/0a2f8baf-58e9-3e4f-bc62-2315242a2112/
www.mendeley.com/catalogue/46ba00bc-b28f-30e9-9f89-14f2b2db28c6/
www.mendeley.com/catalogue/f0c05241-e1d5-3a04-bac9-251a9681dbfd/
www.mendeley.com/catalogue/da00e0cc-009d-3172-a6b8-0030f2740d12/
www.mendeley.com/catalogue/0682d9e1-b8c3-3141-98ba-f208bfe7f0c1/
www.mendeley.com/catalogue/4c6121a2-0d99-31e7-a06c-dbb64f397cab/
www.mendeley.com/catalogue/42e5cbcd-bf13-3725-914c-438bf3c88117/
www.mendeley.com/catalogue/08b82b2d-0af0-3381-a7d6-8c4d9ff3e08b/
www.mendeley.com/catalogue/536700b1-0aab-364e-9ac4-f800d4d75b40/
www.mendeley.com/catalogue/82813fa6-833d-3cfe-b88d-96bd07345bce/
www.mendeley.com/catalogue/00fc59b7-46c1-3431-b8d0-0da310a5be52/
www.mendeley.com/catalogue/0ebd62b5-8ff9-316f-9156-1aea7e2d36b9/
www.mendeley.com/catalogue/6ccb97b5-bc65-384e-b8df-bdd3a21d7bd5/
www.mendeley.com/catalogue/79c5d4d4-7fcf-37b9-bbc6-be3f10e052b1/
www.mendeley.com/catalogue/b3f4260c-eff1-36d4-92fe-dd1c54403637/
www.mendeley.com/catalogue/8dc05e90-3e01-3c58-b1ea-96e7e932a0f3/
www.mendeley.com/catalogue/9badc881-e125-3108-b2ab-8ea6e0a141a5/
www.mendeley.com/catalogue/77c79577-6911-368d-a936-b6d733623a22/
www.mendeley.com/catalogue/41ed8703-c521-38d7-a3af-47c175928357/
www.mendeley.com/catalogue/32bdca03-5814-3aa6-9842-5c8a4da088f3/
www.mendeley.com/catalogue/361eea31-db80-3d8a-a9cf-f70e1273ca21/
www.mendeley.com/catalogue/01f6eb99-1598-3c56-bdf4-07771712e6bd/
www.mendeley.com/catalogue/4994cb27-45ef-3bf6-b76c-b6738548d406/
www.mendeley.com/catalogue/d118bfcc-8da6-31b2-9a2a-baf4082d68bc/
www.mendeley.com/catalogue/871c0b7e-8e6c-323e-8daf-1d406812f346/
www.mendeley.com/catalogue/2abf9533-8dd1-3de2-aa3c-e3bb0bb8aeaf/
www.mendeley.com/catalogue/faf3c28d-945c-3ba3-bfc9-9aaccc7078cf/
www.mendeley.com/catalogue/c8b42541-b3a9-3ef7-a527-e4b9c62359aa/
www.mendeley.com/catalogue/9101e069-ef23-3df0-af86-8c9b0ebc087f/
www.mendeley.com/catalogue/66e7674a-59ac-3543-bef6-cdd3289acbe3/
www.mendeley.com/catalogue/03dd5295-fe98-32ad-8689-8afad0df124a/
www.mendeley.com/catalogue/d7e20fcd-0cb3-3ab0-8bdf-b53c6e8da10d/
www.mendeley.com/catalogue/90b206d4-883c-32b4-99ca-e2938fb5a511/
www.mendeley.com/catalogue/c1eaeb36-3ec9-3d96-9c79-d3be77afebdd/
www.mendeley.com/catalogue/b64cf9c3-0038-3e8d-87a7-a7bbd018e9c4/
www.mendeley.com/catalogue/b19d135b-58af-3e89-b493-12a969bc2cfb/
www.mendeley.com/catalogue/cbf0d72a-a9ec-38d0-8aff-d89fe11574ba/
www.mendeley.com/catalogue/9023de0a-41c6-3ac9-b602-4641151219fc/
www.mendeley.com/catalogue/4b25e49b-4ce5-3d33-8661-68d5c283d1b4/
www.mendeley.com/catalogue/0cb4a8ad-226c-344d-bfd0-1cf30b4d1d8b/
www.mendeley.com/catalogue/a6ec964b-dfbf-34fd-ae79-9db23b111b31/

SpringIOC源码——管理型容器——整体流程【框架专题】相关推荐

  1. MMKV_微信MMKV源码分析(一) | 整体流程

    在使用MMKV框架前,需调用以下方法进行初始化 MMKV.initialize(context); 复制代码 这里的 Java 层主要是获取到保存文件的路径,传入Native层,这里默认的路径是APP ...

  2. Spring源码 (事务篇) - 整体流程

    1.解析配置文件 1.1 .解析配置文件的阶段 处理配置文件是在 refresh => invokeBeanFactoryPostProcessors ,即在调用 BeanFactory后置处理 ...

  3. spring系列-注解驱动原理及源码-spring容器创建流程

    目录 一.spring容器的refresh()[创建刷新] 二.BeanFactory 的创建及预准备工作 1.prepareRefresh()刷新前预处理工作. 2.obtainFreshBeanF ...

  4. ibatis源码学习(一)整体设计和核心流程

    本文主要从ibatis框架的基本代码骨架进行切入,理解ibatis框架的整体设计思路,各组件的实现细节将在后文进行分析. [b][size=large]背景[/size][/b] 介绍ibatis实现 ...

  5. spring 源码深度解析_spring源码解析之SpringIOC源码解析(下)

    前言:本篇文章接SpringIOC源码解析(上),上一篇文章介绍了使用XML的方式启动Spring,介绍了refresh 方法中的一些方法基本作用,但是并没有展开具体分析.今天就和大家一起撸一下ref ...

  6. android 输入法如何启动流程_android输入法02:openwnn源码解析01—输入流程

    android 输入法 02:openwnn 源码解析 01-输入流程 之后要开始 android 日文输入法的测试,因此现在开始研究 android 输入法.之前两 篇文章已经对 android 自 ...

  7. 【Android 10 源码】MediaRecorder 录像流程:MediaRecorder 初始化

    MediaRecorder 用于录制音频和视频,录制控制基于一个简单的状态机.下面是典型的使用 camera2 API 录制,需要使用到的 MediaRecorder API. MediaRecord ...

  8. openxr runtime Monado 源码解析 源码分析:CreateInstance流程(设备系统和合成器系统)Compositor comp_main client compositor

    monado系列文章索引汇总: openxr runtime Monado 源码解析 源码分析:源码编译 准备工作说明 hello_xr解读 openxr runtime Monado 源码解析 源码 ...

  9. Spring源码——声明式事务流程

    前言 最近回顾了一下Spring源码,准备用思维导图的方式简单的将整个源码内容的流程展示出来,思维导图.图片等文件更新在https://github.com/MrSorrow/spring-frame ...

最新文章

  1. ContentProvider是如何实现数据共享的
  2. 一种全自动的牙齿CBCT三维个体识别和分割方法
  3. python3爬虫入门教程-python3爬虫入门程序
  4. 372 Super Pow 超级次方
  5. 2018蓝桥杯省赛---java---C---3(字母阵列)
  6. c语言的翻译叫什么_什么是编译器?什么是集成开发环境?
  7. linux下安装VMware Tools
  8. JS传值中文乱码解决方案
  9. Java求一个数的质因数
  10. 16 树的子结构(这题多复习)
  11. 关于java构造方法的描述_在JAVA语言中,下面关于构造函数描述正确的是()
  12. 闽南理工学院教务网络管理系统所有服务器,闽南理工学院教务管理网络系统登录入口 http://222.77.99.244:8094/jwweb/,精英高考网...
  13. C# 淘宝商品微信返利助手开发-(一)返利助手原理
  14. 数据中心服务器机柜电气参数,数据中心服务器机柜选择指南
  15. 【servlet】登陆验证之验证码模板
  16. 百度权重怎么查询?哪里可以查询百度权重?
  17. java检测磁盘空间大小
  18. C#:DataGridView边框线、标题、单元格的各种颜色
  19. edge浏览器 您的flash可能被禁用或者版本过低
  20. 山东高考六选三学计算机选什么,山东省高中6选3选科数据出炉!和你当初的预想完全不一样...

热门文章

  1. 蓝屏总结(一) ——基本分析方法
  2. 软件测试:购买商品类测试不可忽略的问题
  3. 201771010137 赵栋《面向对象程序设计(java)》第十一周学习总结
  4. Linux系统之进入单用户模式的方法及相关作用
  5. Mysterious Bacteria(唯一质因子解+素数筛)
  6. C++ STL容器详解
  7. 搜狗拼音皮肤 php文件,搜狗拼音输入法皮肤制作
  8. 常用的PostMethod及getMethod请求
  9. 华为杯第一届中国研究生网络安全创新大赛-Bit_QR
  10. 【Java】JDK安装在D盘,环境变量如何配置?