在AOP中,切面通常是通过代理来实现的,而代理只能拦截外部方法调用,对于内部方法调用则不起作用。如果需要在内部方法调用中使用AOP,可以考虑以下几种解决方法:
public void publicMethod() {
// 调用内部方法
privateMethod();
}
@Around("execution(* com.example.MyClass.privateMethod(..))")
public void aroundPrivateMethod(ProceedingJoinPoint joinPoint) throws Throwable {
// 在AOP切面中拦截内部方法调用
// ...
// 执行原始方法
joinPoint.proceed();
// ...
}
private void privateMethod() {
// 内部方法逻辑
}
public void publicMethod() {
// 调用内部方法
privateMethod();
}
@Around("execution(* com.example.MyClass.privateMethod(..))")
public void aroundPrivateMethod(ProceedingJoinPoint joinPoint) throws Throwable {
// 在AOP切面中拦截内部方法调用
// ...
// 执行原始方法
joinPoint.proceed();
// ...
}
private void privateMethod() {
// 内部方法逻辑
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
// 自定义注解
}
public void publicMethod() {
// 调用内部方法
privateMethod();
}
@Around("@annotation(com.example.MyAnnotation)")
public void aroundPrivateMethod(ProceedingJoinPoint joinPoint) throws Throwable {
// 在AOP切面中拦截被注解的方法调用
// ...
// 执行原始方法
joinPoint.proceed();
// ...
}
@MyAnnotation
private void privateMethod() {
// 内部方法逻辑
}
以上是三种常见的解决方法,可以根据具体需求选择合适的方式来实现在内部方法调用中使用AOP。
上一篇:aop应用之权限管理