Spring源码分析(三)-Bean定义阶段细节补充之bean实例化顺序

上一篇:Spring源码分析(二)——Bean定义阶段

一、前言

因为上一篇过长,因此一些细节部分未分析,所以这里单独拉一篇分析上一篇未分析到的一些细节部分;

二、同一级别的BeanDefinition,实例化顺序是怎样的?

spring类扫描顺序默认是按类名字来进行排序的,如:a、b、c;

但是类的顺序可以实现Ordered接口来进行修改,数字越小越靠前;

我们以上一篇BeanFactoryPostProcessor排序方法进行分析吧

org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors

这里比较关键的是,如果你没有指定比较器则会使用默认的比较器

默认的比较器会根据getOrder方法获取一个数值来进行比较,所以这里关键的是getOrder方法里面做了什么,这样我们就搞清楚了spring是如何通过Ordered接口实现类排序的;

其实用过这个接口的读者应该清楚,实现这个接口会让你实现一个getOrder方法,这个方法里面会返回一个int,其实就是获取这个int值进行比较的;

前面的if一般不会进去,我们看getOrder方法就好了

这里需要关注是findOrder方法会去判断类是否实现了Ordered接口,如果实现了则调用其getOrder方法获取对应的值,否则则会返回空,上层方法感知到返回为空,则会返回默认值,默认为Integer.MAX_VALUE,无限大的int值;如果是默认值必定为最后;

/** * Useful constant for the lowest precedence value. * @see java.lang.Integer#MAX_VALUE */int LOWEST_PRECEDENCE = Integer.MAX_VALUE;
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章