`
wx1569020408
  • 浏览: 26916 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Spring核心源码

 
阅读更多

一、常见的初始化方式

spring常见的初始化方式有如下几种:

1. main函数里使用ClassPathXmlApplicationContext

public static void main(String[] args) {
    ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath*:/spring/test/appcontext-dependencies.xml");
    Thread.currentThread().join();
}

2. web.xml通过ContextLoaderListener

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/test/appcontext-dependencies.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

3. web.xml通过DispatcherServlet

<servlet>
    <servlet-name>springDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath*:config/spring/common/appcontext-*.xml,
            classpath*:config/spring/local/appcontext-*.xml
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springDispatcher</servlet-name>
    <url-pattern>/study/*</url-pattern>
</servlet-mapping>

4. spring-test通过SpringJUnit4ClassRunner

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:/spring/test/appcontext-dependencies.xml"})

5. spring4.x通过groovy dsl

import org.hibernate.validator.HibernateValidator
import org.springframework.context.support.ReloadableResourceBundleMessageSource
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean

beans {
    xmlns context: "http://www.springframework.org/schema/context"
    xmlns mvc: "http://www.springframework.org/schema/mvc"

    context.'component-scan'('base-package': "com.chenxiaojie.spring4")
    mvc.'annotation-driven'('validator': "validator")

    validator(LocalValidatorFactoryBean) {
        providerClass = HibernateValidator.class
        validationMessageSource = ref("messageSource")
    }
}

6. spring4.x通过全注解(http://jinnianshilongnian.iteye.com/blog/1991830)

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.chenxiaojie.spring4")
public class MvcConfiguration extends WebMvcConfigurationSupport {
    @Override
    protected Validator getValidator() {
        LocalValidatorFactoryBean localValidatorFactoryBean =
                new LocalValidatorFactoryBean();
        localValidatorFactoryBean.setProviderClass(HibernateValidator.class);
        localValidatorFactoryBean.setValidationMessageSource(messageSource());
        return localValidatorFactoryBean;
    }
}

 

二、初始化流程

无论是上方的哪一种初始化方式最后context初始化代码都是下方的refresh方法,这是典型的模板方法设计模式。

AbstractApplicationContext:

public void refresh() throws BeansException, IllegalStateException {

   // 同步块决定了spring的初始化一定是单线程的(spring作为bean容器默认只初始化一次, 多线程提高初始化速度并没有什么意义)
   synchronized (this.startupShutdownMonitor) {

      // 预准备refresh, 检查environment参数是否合理
      prepareRefresh();

      // 构造beanFactory, 里面包含所有beanDefinition加载, 主要是解析xml和注解
      // 参考AbstractRefreshableApplicationContext->refreshBeanFactory->loadBeanDefinitions方法
      // 参考AbstractBeanDefinitionReader->loadBeanDefinitions(String location, Set<Resource> actualResources)
      // 参考XmlBeanDefinitionReader->loadBeanDefinitions(EncodedResource encodedResource)
      // 参考DefaultBeanDefinitionDocumentReader->doRegisterBeanDefinitions(Element root)
      // 参考ContextNamespaceHandler->ComponentScanBeanDefinitionParser->parse->ClassPathBeanDefinitionScanner->doScan
      // 参考ClassPathScanningCandidateComponentProvider->findCandidateComponents(String basePackage)
      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

      // 预准备beanFactory, 设置基本环境变量
      prepareBeanFactory(beanFactory);

      try {
         // 默认为空实现
         postProcessBeanFactory(beanFactory);

         // 添加实现了PriorityOrdered优先级极高的处理器, 这个环节只走半生命周期, 因为在new的时候postProcessors还未初始化完毕
         // org.springframework.context.annotation.internalConfigurationAnnotationProcessor
         invokeBeanFactoryPostProcessors(beanFactory);

         // 添加实现了Ordered的处理器,
         // org.springframework.context.annotation.internalAutowiredAnnotationProcessor
         // org.springframework.context.annotation.internalRequiredAnnotationProcessor
         // org.springframework.context.annotation.internalCommonAnnotationProcessor
         // org.springframework.aop.config.internalAutoProxyCreator
         // org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor
         registerBeanPostProcessors(beanFactory);

         // 初始化消息
         initMessageSource();

         // 初始化事件处理器
         initApplicationEventMulticaster();

         // 默认空实现
         onRefresh();

         // 注册所有的spring监听器
         registerListeners();

         // 实现化所有业务相关的单例bean
         finishBeanFactoryInitialization(beanFactory);

         // 执行Lifecycle/事件通知等事务
         finishRefresh();
      }

      catch (BeansException ex) {
         // 销毁所有bean
         destroyBeans();

         cancelRefresh(ex);

         throw ex;
      }
   }
}

 

结构图

180720_eKCe_2001825.png

xml解析处理器

173654_WOoO_2001825.png

prepareBeanFactory给beanFactory实例化了三个bean

181425_hW7o_2001825.png

invokeBeanFactoryPostProcessors初始化实现了PriorityOrdered的处理器

181222_QJ0E_2001825.png

registerBeanPostProcessors初始化实现了Ordered的处理器

192600_4D2b_2001825.png

192954_h9nZ_2001825.png

 

转载于:https://my.oschina.net/chenxiaojie/blog/983241

分享到:
评论

相关推荐

    spring核心技术源代码spring核心技术源代码1-9章

    这个压缩包文件包含了Spring核心技术的源代码,涵盖了从基础到高级的多个章节,包括Chapter_01到Chapter_09,这将帮助我们深入理解Spring的工作原理。 首先,让我们从Chapter_01开始,这是Spring入门的基础。这一...

    Spring框架核心源代码的分析及其感受-6

    《Spring框架核心源代码分析及感悟》 Spring框架作为Java企业级应用开发的基石,其强大的功能和灵活性深受开发者喜爱。深入理解Spring的核心源代码,不仅有助于我们更好地使用这个框架,还能提升我们的编程技艺和对...

    spring 1.2源代码

    通过阅读这些源代码,开发者可以学习到Spring如何实现依赖注入(Dependency Injection,DI),这是Spring的核心特性之一。DI使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。此外,你还能看到AOP(面向...

    spring-3.1.1源码和架包

    标题中的"spring-3.1.1源码"指的是Spring框架3.1.1版本的源代码,这是理解Spring工作原理、学习其设计模式以及进行定制化开发的重要资源。源码分析可以帮助开发者深入理解IoC(Inversion of Control,控制反转)和...

    spring实战全部源代码.zip

    《Spring实战》第五版的源代码压缩包"spring实战全部源代码.zip"包含了全面的示例项目,旨在帮助读者深入理解和应用Spring框架。这个压缩包中的"spring-in-action-5-samples-master"目录揭示了书中的各个实战案例,...

    精通spring2.0源代码

    通过研究《精通Spring 2.0源代码》提供的源码,我们可以了解到Spring框架的设计模式、内部工作原理以及如何优化Spring的应用。这不仅可以加深对Spring的理解,还能提升解决实际问题的能力。对于Java开发者来说,掌握...

    SpringSecurity源码

    本教程配套源码旨在帮助开发者深入理解SpringSecurity的工作原理,通过实践提升在安全领域的技能。 在SpringSecurity中,核心概念主要包括以下几个部分: 1. **过滤器链**:SpringSecurity的核心是基于过滤器的Web...

    spring核心jar包

    5. **Spring JDBC**: 为简化JDBC操作提供了一层抽象,它包括数据源管理、SQL语句的执行以及结果集的处理。通过使用Spring JDBC,开发者可以避免编写大量重复的JDBC模板代码。 6. **Spring ORM**: 与ORM(Object-...

    spring-framework-2.0 Java源代码,spring2源代码

    Spring 框架是Java开发领域中的一个核心框架,它为构建高质量的、松耦合的应用程序提供了...对于想要深入理解Spring框架的开发者来说,研究其源代码是极有价值的,能够帮助他们更好地运用和定制Spring,提升开发技能。

    精通spring源代码精通spring源代码

    要精通Spring源代码,意味着深入理解其设计理念、核心组件以及工作原理。以下是对Spring框架主要知识点的详细阐述: 1. **IoC(Inversion of Control)容器**:Spring的核心在于它的依赖注入(DI)机制,它通过反转...

    spring-framework-4.3.0源代码

    此外,源代码还揭示了SpringMVC如何与其他Spring模块(如Spring Core和Spring Web)协同工作,提供完整的Web解决方案。 对于开发者来说,阅读和理解SpringMVC的源代码不仅可以提高编程技巧,还能帮助优化应用性能,...

    精通spring 源代码

    《精通Spring源代码》是罗时飞先生关于Spring框架深入解析的一部著作,旨在帮助开发者更深入地理解Spring的工作原理,提升对Java企业级应用开发的掌控能力。本压缩包包含的文件名为“精通Spring源码”,这通常是一个...

    Spring源代码解析

    本文将深入解析Spring的源代码,帮助开发者理解其内部机制,提升对框架的使用技巧和定制能力。 首先,Spring的核心模块包括IoC(Inversion of Control,控制反转)容器、AOP、数据访问/集成、Web模块等。IoC容器是...

    spring源码中英文注释

    2. **面向切面编程(Aspect-Oriented Programming, AOP)**:Spring的AOP模块支持在不修改源代码的情况下,对代码进行功能增强。这通常用于日志记录、事务管理等。在源码中,你会遇到`Advisor`、`Pointcut`和`Aspect...

    Spring3.0源代码

    通过对Spring3.0.5源代码的深入研究,开发者可以更好地理解其工作原理,从而优化自己的代码,提升应用程序的性能和稳定性。同时,这也是学习设计模式和最佳实践的好机会,因为Spring框架本身就是一个优秀的示例,...

    spring源码合集spring源码合集

    8. **模拟Spring底层原理**:"02-手写模拟Spring底层原理-周瑜"和"01-Spring底层核心原理解析-周瑜"提供了从零开始构建类似Spring框架的实践机会,通过动手实践加深对Spring核心机制的理解。 这些源码解析资料覆盖...

    Spring2.5 源代码

    通过对Spring 2.5源代码的深入研究,开发者不仅可以了解其工作原理,还能学习到良好的设计模式和最佳实践,提升自己的编程技能。此外,源代码中包含了各种设计模式的实例,如工厂模式、单例模式、观察者模式等,这...

    spring 源码中文注释

    这份"spring 源码中文注释"包含了对Spring框架源码的详细解读,对于理解其工作原理、优化代码以及定制化开发具有重要意义。 首先,我们来看看Spring的核心组件——IoC容器。IoC容器是Spring的核心,它负责管理对象...

    spring3.2 源码 jar包

    在本压缩包中,你将获得Spring 3.2版本的源码jar包,这对于开发者来说是一个宝贵的资源,可以深入理解Spring的工作原理,提高代码调试和优化的能力。 首先,让我们来了解一下Spring 3.2的主要特性: 1. **依赖注入...

Global site tag (gtag.js) - Google Analytics