Spring aop的通知名称的问题?
Spring AOP拦截器通知的名字如下:
MethodBeforeAdviceInterceptor (前置通知)
AspectJAfterThrowingAdvice (异常后通知)
AspectJAfterAdvice (最终通知)
AfterReturningAdviceInterceptor (后置通知)
请问大家,为什么有的以Interceptor结尾,而另一些以Advice结尾?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
楼上说的也不准确,这还是要从AOP联盟和规范说起,你可在
spring-aop
包下看到,两块东西,其中一块就是aop规范的接口,Rod Johnson只是把它集成了,没有打算重写和修改规范的意图,而其中除了一个Advice
顶级接口和一个AdiceException
剩下的主要以Interceptor
结尾spring aop其中部分通知接口继承了Advice接口但是自己又重新定义了,例如:
org.springframework.aop.BeforeAdvice
而部分则采用aop规范的接口,例如:
org.aopalliance.intercept.MethodInterceptor
更新(2018-09-01):
我就再说多一点,首先不是所有通知都实现了
MethodInterceptor
(环绕通知)前置通知:
MethodBeforeAdvice
、BeforeAdvice
只是继承了Advice
后置通知:
AfterReturningAdvice
、AfterAdvice
也只是继承了Advice
异常通知:
ThrowsAdvice
继承了AfterAdvice
,也是一种后置通知引介通知:
IntroductionInterceptor
才是继承了MethodInterceptor
从以上来看,命名还是很规范的,对吧,主要以
advice
为后缀Spring AOP
无意将Aspectj
拒之门外,而是采取了兼收并蓄的方式,即继承了Aspectj
的表达式语法来定义切点和增强(你可以简单理解为通知),所以一般要用AOP
的话除了引入spring-aop.jar
的包还会引用aspecj.weaver.jar
(或者aspect.tools.jar
,后者包含前者)来引入语法相关的工具(一些注解和接口,例如@Before
),一般我们有若干方式来启用Aspectj
,但主要就是注解和配置两种,当然了,对应到容器中主要还是实体类,而这些类主要以Aspectj
为前缀,例如AspectJMethodBeforeAdvice
和AspectJExpressionPointcutAdvisor
(注意,Advisor
不用于Advice
)这两种并不都是通知
以Interceptor结尾的类主要是
org.aopalliance.intercept.MethodInterceptor
接口的实现类,在MethodBeforeAdviceInterceptor
源码中可以看到:可以看到在
MethodBeforeAdviceInterceptor
中就包含了一个MethodBeforeAdvice
,并且在注释里坐着建议不要直接使用这个类因为这一种'Interceptor'用于生成代理对象,即实际上通过cglib生成的代理类,就是这货。
而
MethodBeforeAdvice
这类'advice'才是你所说的通知,一些操作比如切面判断,执行对应的代理方法等操作就是在里面实现的。之前我正好有写到模拟实现spring的AOP的功能,你感兴趣可以看看:
实现AOP
引入aspectj实现AOP切点
加强AOP功能