框架中有两个重要的执行排序概念：index（顺序位），priority（优先级）：

### 1、涉及排序的几个概念

* Bean 的同类排序，用 index 表示
* 拦截器的执行顺序，用 index 表示
* 过滤器的执行顺序，用 index 表示
* 容器生命周期的执行顺序，用 index 表示
* 插件的加载顺序，用 priority 表示

### 2、index（顺序位）越小，越先执行

（如果是环绕处理，越小，也意味着越外层）。<mark>不要用最大值(Integer.MAX_VALUE)，一般是框架留用的</mark>。目前框架内置的几个注解：

显示顺序位

| 常用注解 | 类型 | 性质 |  顺序位 | 备注 |
| -------- | -------- | -------- | -------- | -------- |
| `@Transaction`        | 拦截器 | 环绕处理     | 120     | |
| `@CachePut`           | 拦截器   | 环绕处理     | 110     | |
| `@CacheRemove`    | 拦截器  | 环绕处理     | 110     | |
| `@Cache`               | 拦截器 | 环绕处理     | 111     | |
| | | | | |
| `@Valid`                 | 拦截器   | 环绕处理     | 1     |  |
| | | | | |
| `@DynamicDs`       | 拦截器  | 环绕处理     | 100     | |

隐式顺序位

* 所有 LifecycleBean 或 `@Init` 函数，当有相互依赖时，会自动排序。
* 所有 `@Bean` 函数，当有相互依赖时，会自动排序。（v2.5.8 后支持）


### 3、priority（优先级）越大，越先执行

这个在 [《插件扩展机制（Spi）》](/article/58) 提到，是用于插件执行顺序的。本来可以统一的，但想给插件一点独特性。

插件太多，不一一列出来了。<mark>用户的插件，一般用 1 就可以了</mark>。


### 4、@Bean(index) 和 LifecycleBean.index 区别


* `@Bean(index)`，表示当前 bean 在同类 bean 中的排序（比如通过 List[Bean] 注入时）。如果当前 bean 是 LifecycleBean，则同时为 LifecycleBean.index。
* `LifecycleBean.index`，表示当前容器生命周期接口在 AppContext:start 时的执行顺序





