`
yourenyouyu2008
  • 浏览: 286077 次
  • 性别: 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);
                    }
                }
            }
        }
    }

分享到:
评论

相关推荐

    Java架构师之源码分析专题SpringBoot2.x、Spring5、SpringMVC、Mybatis源码分析

    源码分析会涉及SpringBoot的启动流程,包括`SpringApplication.run()`方法的执行细节,自动配置的实现机制,以及如何通过条件注解选择合适的bean。理解这些将帮助你自定义启动配置,优化项目结构。 接着,进入...

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

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

    springboot 启动过程源码分析

    SpringBoot 启动过程源码分析 SpringBoot 的启动原理是基于 JavaConfig 形式的配置,使用 @Configuration 注解标注的启动类来配置 IoC 容器。@SpringBootApplication 注解是 SpringBoot 的核心注解,它包括了三个...

    Spring源码分析

    以上只是Spring源码分析的部分内容,实际源码中还包括Spring的其他模块,如Spring Batch(批处理)、Spring Security(安全)、Spring Integration(集成)等。理解并掌握Spring源码,有助于我们更好地利用Spring...

    spring 源码中文注释

    在源码分析的过程中,读者会深入理解Spring的内部工作机制,例如如何解析配置、如何创建bean实例、如何实现AOP代理等。这将有助于开发者编写更高效、更健壮的代码,也能为参与Spring的扩展或定制打下坚实基础。 总...

    spring高级源码分析

    《Spring高级源码分析》是针对Java开发人员深入理解Spring框架的一份宝贵资源。Spring作为Java企业级应用的基石,其强大的功能和灵活性源于其深厚的设计理念和精巧的源码实现。本分析将深入探讨Spring的核心机制,...

    spring-aop-ProxyFactoryBean 源码分析

    5. **源码分析**: 在`ProxyFactoryBean`的`getObject()`方法中,会调用`createAopProxy()`生成`AopProxy`,然后`AopProxy`的`getProxy()`方法返回实际的代理对象。`createAopProxy()`会根据配置判断使用JDK还是...

    Spring in Action 源码

    3. **Spring Boot**:Spring Boot简化了Spring应用的启动和配置过程。源码中包含的Spring Boot项目展示了自动配置、起步依赖和Actuator等特性。 4. **Spring Data**:Spring Data为各种持久化技术(如JPA、MongoDB...

    Spring2(源码)

    源码分析是理解Spring工作原理的关键,能帮助开发者深入掌握如何在实际项目中有效地使用和优化Spring。下面将对Spring框架的核心组件、设计理念以及源码中的关键部分进行详细的解释。 1. **依赖注入(DI)** - ...

    spring-data源码

    通过对Spring Data Elasticsearch 2.1.10.RELEASE的源码分析,我们可以深入了解其工作原理,从而更好地利用这一工具。 首先,Spring Data Elasticsearch的核心理念是提供一个统一的编程模型,让开发者能以声明式的...

    Spring5全部源码

    它简化了Spring应用的初始搭建以及运行过程,通过自动配置和起步依赖,让开发者能够快速启动项目。 7. **Spring Data** Spring Data项目提供了一种统一的方式来访问各种数据存储,包括JPA、MongoDB、Cassandra等。...

    spring源码合集spring源码合集

    3. **父子容器启动原理**:在"17-SpringMVC源码—父子容器启动原理深入剖析-徐庶"中,我们将揭示Spring MVC如何构建父子容器,并解释容器的启动流程。理解这一过程有助于我们优化应用的初始化性能,合理设计Bean的...

    SpringBoot_SpringSecurity-源码.rar

    SpringBoot_SpringSecurity-源码.zip 这个压缩包文件主要包含了SpringBoot集成SpringSecurity的源码分析。SpringBoot是Java开发中一个流行的轻量级框架,它简化了配置和应用部署,使得开发者可以快速搭建应用程序。...

    四、Spring源码分析——动态代理

    7. **源码分析** 分析Spring源码有助于深入理解其动态代理的工作原理。例如,可以查看`org.springframework.aop.framework.JdkDynamicAopProxy`和`org.springframework.aop.framework.CglibAopProxy`这两个类,它们...

    spring框架学习源码

    7. **源码分析**:深入理解这些组件的源码,可以帮助开发者更好地了解其工作原理,从而优化微服务架构,提高系统的性能和稳定性。例如,通过阅读Eureka的源码,可以了解到服务注册、心跳机制、服务健康检查等核心...

    Spring-5.1.5源码

    总之,`Spring-5.1.5源码`的分析涵盖了Spring框架在Web应用中的核心功能,包括初始化、配置加载、依赖注入、AOP、异常处理以及现代化Web技术的支持。深入理解这些知识点,对于提升Spring框架的使用技巧和开发效率...

    Spring有关资料 源码

    8. **Spring Boot**:Spring Boot简化了Spring应用的初始搭建和配置过程,采用“约定优于配置”的原则,提供了一种快速启动和运行Spring应用的方式。 9. **Spring Security**:Spring的安全模块,用于身份验证和...

    Spring 源码分析文档----自用

    ### Spring 源码分析——设计模式篇 #### 一、引言 Spring框架作为Java企业级开发领域中不可或缺的一部分,其内部集成了多种设计模式,不仅有助于提高系统的可维护性和扩展性,还能够帮助开发者更好地理解和应用...

    spring学习事务源码

    在源码分析中,我们可以看到当一个方法被@Transactional标记后,Spring会创建一个代理,这个代理在目标方法执行前后插入事务管理逻辑。在方法开始前,如果满足事务启动条件,就会调用`PlatformTransactionManager`的...

Global site tag (gtag.js) - Google Analytics