在 API(interface) 方法中使用带有@annotation 的AOP 调用方法拦截器
Invoking method interceptor using AOP with @annotation in API(interface) method
想在切入点表达式中使用@annotation 拦截使用自定义注解(在本例中为@TestDocument)注解的方法。
当接口和实现方法都使用自定义注释进行注释时,它可以工作。(但期望通过仅注释接口方法来工作,假设它是 possible.please 正确的,如果不是这样的话)。
求推荐。
示例代码:
建议class
public class AfterAdvisor implements AfterReturningAdvice {
public void afterReturning(Object returnValue, Method method,Object[] args, Object target) {
System.out.println("AfterAdvisor : after method invocation!");
}
自定义注释:
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface TestDocument {
string test default "";
}
配置详情:
<aop:config>
<aop:pointcut id="addPointcut" expression="@annotation(com.xxx.annotation.TestDocument)" />
<aop:advisor pointcut-ref="addPointcut" advice-ref="afterAdvisor" order="1" />
</aop:config>
<bean id="afterAdvisor" class="com.xxx.AfterAdvisor" />
Testservice和TestServiceImpl是接口和实现class分别有公共方法addTest(TestVO testVo)如图
现在2例:
1.addTest(TestVO testVo) 方法在接口和实现中都使用@TestDocument (test="test")) 自定义注释进行注释 class 如图所示 below.In this如果它正在拦截来自 AfterAdvisor class 的建议 class 打印 "AfterAdvisor : after method invocation!",因为切点表达式 =“@annotation(com.xxx.annotation.TestDocument) 用于拦截任何注释的方法@TestDocument.
接口和实现class(两个方法都用@TestDocument注解):
public interface TestService{
@TestDocument (test="test"))
public testVO addTest(TestVO testVo) ;
}
public class TestServiceImpl implements TestService{
@TestDocument (test="test"))
public testVO addTest(TestVO testVo) {
//do something
return testVo;
}
但是下面这个案例不起作用,如果可能的话,预计会起作用。
2.addTest(TestVO testVo) 方法用@TestDocument (test="test")) 接口中的自定义注释仅显示如下(在实现中未如上所示class,我们不想在实现中注释方法 class)。
在这种情况下,它不会拦截建议 class,因此不会从上面的 AfterAdvisor class 打印 "AfterAdvisor : after method invocation!"。
接口与实现class(只有接口方法用@TestDocument注解):
public interface TestService{
@TestDocument (test="test"))
public testVO addTest(TestVO testVo) ;
}
public class TestServiceImpl implements TestService{
public testVO addTest(TestVO testVo) {
//do something
return testVo;
}
我觉得做不到。在 Java 中,注释不是从接口继承的。可以做的是:
- 将 TestService 接口更改为抽象基础 class 并将 @Inhertied 添加到您的注释定义中
- 更改要应用于所有 sublcasses/implementations TestService 的切入点:execution(public * com.xxx.TestService+.*(..))
想在切入点表达式中使用@annotation 拦截使用自定义注解(在本例中为@TestDocument)注解的方法。
当接口和实现方法都使用自定义注释进行注释时,它可以工作。(但期望通过仅注释接口方法来工作,假设它是 possible.please 正确的,如果不是这样的话)。
求推荐。
示例代码: 建议class
public class AfterAdvisor implements AfterReturningAdvice {
public void afterReturning(Object returnValue, Method method,Object[] args, Object target) {
System.out.println("AfterAdvisor : after method invocation!");
}
自定义注释:
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface TestDocument {
string test default "";
}
配置详情:
<aop:config>
<aop:pointcut id="addPointcut" expression="@annotation(com.xxx.annotation.TestDocument)" />
<aop:advisor pointcut-ref="addPointcut" advice-ref="afterAdvisor" order="1" />
</aop:config>
<bean id="afterAdvisor" class="com.xxx.AfterAdvisor" />
Testservice和TestServiceImpl是接口和实现class分别有公共方法addTest(TestVO testVo)如图
现在2例:
1.addTest(TestVO testVo) 方法在接口和实现中都使用@TestDocument (test="test")) 自定义注释进行注释 class 如图所示 below.In this如果它正在拦截来自 AfterAdvisor class 的建议 class 打印 "AfterAdvisor : after method invocation!",因为切点表达式 =“@annotation(com.xxx.annotation.TestDocument) 用于拦截任何注释的方法@TestDocument.
接口和实现class(两个方法都用@TestDocument注解):
public interface TestService{
@TestDocument (test="test"))
public testVO addTest(TestVO testVo) ;
}
public class TestServiceImpl implements TestService{
@TestDocument (test="test"))
public testVO addTest(TestVO testVo) {
//do something
return testVo;
}
但是下面这个案例不起作用,如果可能的话,预计会起作用。
2.addTest(TestVO testVo) 方法用@TestDocument (test="test")) 接口中的自定义注释仅显示如下(在实现中未如上所示class,我们不想在实现中注释方法 class)。 在这种情况下,它不会拦截建议 class,因此不会从上面的 AfterAdvisor class 打印 "AfterAdvisor : after method invocation!"。
接口与实现class(只有接口方法用@TestDocument注解):
public interface TestService{
@TestDocument (test="test"))
public testVO addTest(TestVO testVo) ;
}
public class TestServiceImpl implements TestService{
public testVO addTest(TestVO testVo) {
//do something
return testVo;
}
我觉得做不到。在 Java 中,注释不是从接口继承的。可以做的是:
- 将 TestService 接口更改为抽象基础 class 并将 @Inhertied 添加到您的注释定义中
- 更改要应用于所有 sublcasses/implementations TestService 的切入点:execution(public * com.xxx.TestService+.*(..))