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"

1context.'component-scan'('base-package': "com.chenxiaojie.spring4") 2mvc.'annotation-driven'('validator': "validator") 3 4validator(LocalValidatorFactoryBean) { 5 providerClass = HibernateValidator.class 6 validationMessageSource = ref("messageSource") 7}

}

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();

1 // 构造beanFactory, 里面包含所有beanDefinition加载, 主要是解析xml和注解 2 // 参考AbstractRefreshableApplicationContext->refreshBeanFactory->loadBeanDefinitions方法 3 // 参考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();

1 // 预准备beanFactory, 设置基本环境变量 2 prepareBeanFactory(beanFactory); 3 4 try { 5 // 默认为空实现 6 postProcessBeanFactory(beanFactory); 7 8 // 添加实现了PriorityOrdered优先级极高的处理器, 这个环节只走半生命周期, 因为在new的时候postProcessors还未初始化完毕 9 // org.springframework.context.annotation.internalConfigurationAnnotationProcessor 10 invokeBeanFactoryPostProcessors(beanFactory); 11 12 // 添加实现了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);

1 // 初始化消息 2 initMessageSource(); 3 4 // 初始化事件处理器 5 initApplicationEventMulticaster(); 6 7 // 默认空实现 8 onRefresh(); 9 10 // 注册所有的spring监听器 11 registerListeners(); 12 13 // 实现化所有业务相关的单例bean 14 finishBeanFactoryInitialization(beanFactory); 15 16 // 执行Lifecycle/事件通知等事务 17 finishRefresh(); 18 } 19 20 catch (BeansException ex) { 21 // 销毁所有bean 22 destroyBeans(); 23 24 cancelRefresh(ex); 25 26 throw ex; 27 }

} }

结构图

xml解析处理器

prepareBeanFactory给beanFactory实例化了三个bean

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

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )