对spring启动顺序的粗浅理解

         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的扩展点,然后从这几个接口出发,了解体会自己项目中的代码框架

猜你喜欢

转载自blog.csdn.net/David_lou/article/details/82776834