`
yourenyouyu2008
  • 浏览: 281965 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring启动流程源码分析

 
阅读更多

spring启动流程

AbstractApplicationContext

构造好beanFactory后遍历每个定义的bean,如果需要生成实例就生成实例

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
        // Initialize conversion service for this context.
        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));
        }

        // Stop using the temporary ClassLoader for type matching.
        beanFactory.setTempClassLoader(null);

        // Allow for caching all bean definition metadata, not expecting further changes.
        beanFactory.freezeConfiguration();

        // Instantiate all remaining (non-lazy-init) singletons.
        beanFactory.preInstantiateSingletons();
    }

实例化可以实例化的bean(Singleton并且不是LazyInit),由于绝大多数bean都是Singleton(默认)的,所以项目启动时会实例化很多对象,实现ApplicationContextAware接口的bean会在实例化时将ApplicationContext设置进去,这样就可以在类内部直接方法spring的上下文了。

DefaultListableBeanFactory

public void preInstantiateSingletons() throws BeansException {
        if (this.logger.isInfoEnabled()) {
            this.logger.info("Pre-instantiating singletons in " + this);
        }
        synchronized (this.beanDefinitionMap) {

            List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);
            for (String beanName : beanNames) {
                RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
                if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
                    if (isFactoryBean(beanName)) {
                        final FactoryBean factory = (FactoryBean) getBean(FACTORY_BEAN_PREFIX + beanName);
                        boolean isEagerInit;
                        if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                            isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
                                public Boolean run() {
                                    return ((SmartFactoryBean) factory).isEagerInit();
                                }
                            }, getAccessControlContext());
                        }
                        else {
                            isEagerInit = (factory instanceof SmartFactoryBean &&
                                    ((SmartFactoryBean) factory).isEagerInit());
                        }
                        if (isEagerInit) {
                            getBean(beanName);
                        }
                    }
                    else {
                        getBean(beanName);
                    }
                }
            }
        }
    }

分享到:
评论

相关推荐

    Spring Boot 2.2.2 启动过程源码分析.md

    Spring Boot 2.2.2 启动过程源码分析,SpringApplication 实例 run 方法运行过程,.分析了 SpringApplication 实例对象构造方法初始化过程,下面继续来看下这个 SpringApplication 对象的 run 方法的源码和运行流程。

    Spring启动流程refresh()源码深入解析

    主要给大家介绍了关于Spring启动流程refresh()源码深入解析的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Spring MVC 启动过程源码分析详解

    主要介绍了Spring MVC 启动过程源码分析详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    深入理解Spring与Dubbo整合原理与源码分析:从启动类配置到注解解析

    本文主要从Spring与Dubbo整合的角度,深入探讨了其原理与源码分析。首先,我们从应用启动类与配置入手,详细解析了@PropertySource和@EnableDubbo两个重要注解的作用和实现方式。然后,我们深入研究了@...

    spring源码底层解析(1.81G)

    spring源码底层分析(1.81G)〖课程介绍〗:Spring启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,为上层应用提供...

    可能是全网最全的SpringBoot启动流程源码分析(基于 2.1.5 版本)

    使用 Spring Boot 启动一个微服务十分简单,只需要在启动类上调用 SpringApplication 的run方法即可 点击进入run方法 1 run 静态辅助类,可用于运行使用默认配置(即我们添加的一系列注解)的指定源的 ...

    spring启动componentscan类扫描加载过程

    spring启动componentscan类扫描加载过程—源码分析Java开发Java经验技巧共16页.pdf.zip

    spring源代码解析

    而一般的启动过程,Spring会使用一个默认的实现,XmlWebApplicationContext – 这个上下文实现作为在web容器中的根上下文容器被建立起来,具体的建立过程在下面我们会详细分析。 Java代码 public class ...

    spring mvc项目

    可用于分析spring mvc源码、spring mvc父子容器初始化流程、session和cookie机制、spring session等,也可以用于学习Java Web(servlet、filter、listener等)、spring源码等。 该项目使用servlet3.0规范,无web.xml...

    spring-boot-source:Spring Boot源码分析+注解

    spring-boot-source Spring Boot源码分析1.核心原始主线流程分析2.AutoConfig自动装配过程-Mybatis RabbitMQ Redis等自动装配过程3.Spring Boot与IOC关联4,Spring Boot集成的Tomcat启动流程

    新版本SpringCloud2学习手册

    负载均衡器源码分析 33 负载均衡器重试机制 33 服务保护机制SpringCloud Hystrix 33 微服务高可用技术 33 服务降级、熔断、限流概念 34 服务学崩效应 34 服务降级 34 服务熔断 35 服务隔离 35 服务限流 36 ...

    java8集合源码分析-springboot:学习springboot

    集合源码分析 Springboot的重要性 简化部署、简化配置、简化编码、快速创建 SpringBoot启动流程解析 章节目录 ·一:环境准备 ·Java8、·Maven3.3、·IntelliJIDEA、·Mysql5.7+ Java8新特性 ·Lambda表达式、·...

    spring-annotion:Spring源码分析以及注解开发

    Spring注解驱动开发,包含一个refresh()方法的流程(在resources目录下) 模块介绍 ---&gt; ext扩展原理包含beanFactoryPostProcessor,BeanDefinitionRegistryPostProcessor和事件监听器等---&gt; tx Spring声明...

    Syske#person-learning-note#Tomcat源码分析-壹——启动过程值init方法1

    前言从今天开始,我们开始分析tomcat的源码,至于原因嘛,第一Tomcat是非常优秀的web服务器,它占据着全球一半以上的市场份额,就连spring boot

    XXL-JOB调度系统学习、调度流程、spring生命周期

    XXL-JOB学习 xxl-job主流分析,包含调度客户端任务自动注册,服务端内部调度线程调度分析 开源源码赏析,代码分析,spring启动流程分析 Java多线程,线程池启停,设计模式分析

    SpringCloud精品屋微服务治理版

    基于精品屋构建的Spring Cloud 微服务技术栈学习型项目,致力于原创文学阅读与写作,提供了爬虫工具用于开发过程中测试数据的采集。采用了时下最新的Spring Boot2 、Spring Cloud Hoxton.SR4、 MyBatis3DynamicSql、...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE...

    Spring技术内幕

    你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码中一窥Java语言的精髓。此外,本书还展示了阅读源代码的卓越方法,不仅授你以鱼,而且还授你以渔!, 如果你以一种淡定的心态...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE...

Global site tag (gtag.js) - Google Analytics