spring-启动源码解析
之前看过很多次spring的源码,一直想着要输出一下,却一直懒得动笔。最近终于确定了大致目标和方向,也给自己定了几个除开工作外的重点事项。有了明确的方向,有些东西想清楚了,才能够静下心来搞技术,写写博客,不然总是会怀疑或者被打断。也是逼着自己理清思路的一个过程。
开始动工!
启动一个最简的spring项目,分析一个spring的启动过程,需要以下maven配置:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
国内可用的maven仓可自行百度,常用的包都可以下载到,但不排除很多包都拉不到的情况,毕竟免费的服务往往都是有缺陷的,之前试过很多远程仓都无功而返,实在不行就只能自己找jar包,然后maven文件指定本地jar包路径了。
我用的是以下配置:
<mirrors>
<mirror>
<id>ui</id>
<name>Mirror from alibaba</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
一个最简单的demo开始分析
要分析spring的启动过程,我们可以从以下最简的demo分析起:
application.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<bean id="demo2" class="com.blog.Demo2" >
</bean>
<bean id="demo" class="com.blog.Demo" >
<property name="demo2" ref="demo2"> </property>
</bean>
</beans>
Demo Demo2代码块:
Test启动类:
通过以上这些步骤,我们运行Test的main方法,就可以启动一个spring容器了,main方法中这段代码的运行,就包含了整个spring的启动最核心过程,无论是基于web的spring项目,还是微服务的springboot,其实核心都是在这里面,只不过是额外添加了一些其他的功能而已,比如自动装箱,比如内嵌tomcat,比如基于注解的额外的BeanPostProcessor之类的,但是万变不离其宗,我们只要掌握了最关键的东西,对于扩展的上手就会非常快。
spring的核心启动过程分析
通过以上Test启动类的第一行代码:
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application3.xml");
我们跟进去这一行代码,最终可以看到以下逻辑:
这里的refresh方法就是整个spring启动的核心所在,继续跟进去可以看到有几大步骤:
我们逐步来解释下每一个步骤,这里我们暂时先不理会spring复杂的继承体系和beanfactory和ApplicationContext等的关系,这个适合后面再讲,不然容易把人整懵。