Spring AOP:创建检查父 class 注释的切入点
Spring AOP: create pointcut which check parent class annotation
我有下一个接口和实现:
@Step
public interface TestAopComp {
void test();
}
@Component
public class TestAopCompImpl implements TestAopComp{
public void test(){
System.out.println("test");
}
}
我需要拦截 classes 的所有方法的执行,它使用注释 @Step 扩展了 classes。请帮我写切入点。
例如,我将下一个切入点用于 classes 的拦截方法,由 @Step 注释:
@Pointcut("@within(Step)")
但它不起作用,如果我只注释 super class
我正在调查问题。如果你使用 extends from class (它可能是抽象的)并且注释声明为 Inherited 那么我的切入点将起作用,但它不适用于已实现的接口。
下一个示例可以工作,但它不适用于已实现接口上的注释:
@Step
public abstract class TestAopComp {
public abstract void test();
}
@Component
public class TestAopCompImpl extends TestAopComp{
public void test(){
System.out.println("test");
}
}
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Step {
}
@Component
@Aspect
public class Aspect {
@Pointcut("@within(Step)")
public void stepClass(){}
@Around("stepClass()")
public void stepAround(ProceedingJoinPoint pjp){
System.out.println("before");
try {
pjp.proceed(pjp.getArgs());
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("after");
}
}
我有下一个接口和实现:
@Step
public interface TestAopComp {
void test();
}
@Component
public class TestAopCompImpl implements TestAopComp{
public void test(){
System.out.println("test");
}
}
我需要拦截 classes 的所有方法的执行,它使用注释 @Step 扩展了 classes。请帮我写切入点。
例如,我将下一个切入点用于 classes 的拦截方法,由 @Step 注释:
@Pointcut("@within(Step)")
但它不起作用,如果我只注释 super class
我正在调查问题。如果你使用 extends from class (它可能是抽象的)并且注释声明为 Inherited 那么我的切入点将起作用,但它不适用于已实现的接口。
下一个示例可以工作,但它不适用于已实现接口上的注释:
@Step
public abstract class TestAopComp {
public abstract void test();
}
@Component
public class TestAopCompImpl extends TestAopComp{
public void test(){
System.out.println("test");
}
}
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Step {
}
@Component
@Aspect
public class Aspect {
@Pointcut("@within(Step)")
public void stepClass(){}
@Around("stepClass()")
public void stepAround(ProceedingJoinPoint pjp){
System.out.println("before");
try {
pjp.proceed(pjp.getArgs());
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("after");
}
}