Skip to content

Instantly share code, notes, and snippets.

@wutingjia
Created October 5, 2019 13:00
Show Gist options
  • Save wutingjia/42b3589da64317265837b600f2e89fc1 to your computer and use it in GitHub Desktop.
Save wutingjia/42b3589da64317265837b600f2e89fc1 to your computer and use it in GitHub Desktop.
关于@pointcut的思考

关于@Pointcut的思考。

最近在写微服务公共组件的切面时,被要求切点表达式最好可以通过各服务配置文件外部读取的方式获得。

最后发现使用SpringAop说比较难以实现的,根本原因如下:

@Pointcutvalue值需要一个编译期常量。

1、编译期简单来说就是从源码打包到jar包的过程,之后的运行期自然是类加载运行的过程。
2、编译期常量会在编译的时候直接将实际值编译成自己文件,即在编译期就能找到常量的值。
3、spring-aop的原理(除了运行时织入)就是在编译时就将其转换为经过切面代理的字节文件。
4、类似@Value使用的占位符即是运行时从外部文件读取注入的。
5、一个疑问是,为什么@Pointcut的RetentionPolicy是Runtime。

那什么样的值会被认为是编译期常量?他必须包含以下全部:

  • 声明为final
  • 基本类型或者是String
  • 在声明的时候初始化
  • 初始化使用的是常量表达式!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment