Spring家族有很多优秀的子项目,大家喜欢统一叫做spring全家桶,最近我们项目在使用spring-boot微服务模式,再运用了netfix的rpc框架,确实较之前的项目复杂性上有了较大精简。而且很新奇的是,spring-boot的启动变成了SpringBootApplicationStarter的main方法,取代了jetty的war包部署,这个点之后再仔细探究,今天还是想写写对spring的启动顺序的粗浅理解。
很多人写spring启动顺序的文章都非常详细,但是读下来有很大的困难性,而且spring本身的项目非常复杂,仔细专研往往会迷失在深层的方法调用里面。我之前查看Spring启动很多次,但是代码追下去之后头晕目眩,前后很难连贯起来,更不要提融会贯通,追完整个启动代码觉得十分消耗脑力。在这次学习spring-boot的时候查看了启动代码,觉得spring-boot确实对Spring做了很大的优化,学习起来可能对我这样脑处理栈较浅的人来说稍微友好一点。
下面我就稍微写下最近查看Spring代码的一些思考所得。不一定正确,也不够详细,只是为了做写笔记,希望不会给大家带来困扰。
Spring启动顺序:1:准备environment
2.创建context
3:创建beanfactory
4.加载beanDefinition
5:注入BeanFactoryPostProcessor
6.执行BeanFacotryPostProcessor
7.注入BeanPostProcessor
8.创建Bean实例
9.发送成功的消息
其实上面的每个过程都很复杂,而且有很多步骤是我们个性化自己项目框架的重要扩展点。
比如我们经常看到的几个接口:
1:BeanFactoryPostProcessor,
2:BeanFactoryPostProcessor的子接口BeanDefinitionRegistryPostProcesser,都可以在beanDefinition被加载完之后修改beandefinition的属性,像mybatis和netfix的Feight都是在BeanDefinitionRegistryPostProcessor的基础上进行的扩展。
3:BeanPostProcessor的接口可以帮助我们在Bean初始化之后进行一些特殊处理,比如切面变成或者是动态代理。
4:InitializingBean,在bean创建之后,属性被注入之后调用,这一个bean生命周期之中可以被改动的最后一个接口。
其余的接口我不是经常看到,所以也不敢乱讲,但是我希望大家能从整体上了解spring,知道spring的扩展点,然后从这几个接口出发,了解体会自己项目中的代码框架