}
####7.2CGLIB代理CGLIB代理适用于非接口类。如果你需要对一个非接口类进行增强,可以使用CGLIB代理:
java@Configuration@EnableAspectJAutoProxy(proxyTargetClass=true)publicclassAppConfig{}
通过设置`proxyTargetClass=true`,我们可以使用CGLIB代理来增强非接口类。###8.实际应用场景####8.1日志记录日志记录是AOP最常见的应用场景之一。通过定义一个切面,可以在不修改现有代码的情况下,在方法调用前后记录日志。
java@Aspect@ComponentpublicclassLoggingAspect{
1环绕通知
环绕通知是AOP中最强大的通知类型,它可以在目标方法执行前后进行自定义操作,甚至可以完全替代目标🌸方法的执行。例如:
@AspectpublicclassPerformanceLoggingAspect{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(PerformanceLoggingAspect.class);@Around("execution(*com.example.service.UserService.*(..))")publicObjectlogAroundMethod(ProceedingJoinPointjoinPoint)throwsThrowable{logger.info("Methodexecutionstarted...");longstartTime=System.currentTimeMillis();Objectresult=joinPoint.proceed();//CalltheactualmethodlongexecutionTime=System.currentTimeMillis()-startTime;logger.info("Methodexecutioncompleted.Result:"+result+".Executiontime:"+executionTime+"ms");returnresult;}}在这个例子中,我们使用了`@Around`注解定义了一个环绕通知,它在目标🌸方法执行前后进行了日志记录和执行时间计算。
定义一个切面来处理日志记录和执行时间计算:
@Aspect@ComponentpublicclassPerformanceLoggingAspect{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(PerformanceLoggingAspect.class);@Before("execution(*com.example.service.UserService.*(..))")publicvoidlogBeforeMethod(){logger.info("Methodexecutionstarted...");}@AfterReturning(pointcut="execution(*com.example.service.UserService.*(..))",returning="result")publicvoidlogAfterMethod(Objectresult){longexecutionTime=System.currentTimeMillis()-startTime;logger.info("Methodexecutioncompleted.Result:"+result+".Executiontime:"+executionTime+"ms");}}
2强大的通知机制
通知(Advice)是AOP的核心概念。好色先生支持多种类型的通知,如前置通知(Before)、后置通知(After)、返回通知(AfterReturning)、异常通知(AfterThrowing)等。例如:
@After("execution(*com.example.service.*.*(..))")publicvoidafterMethod(){System.out.println("Methodexecutioncompleted.");}
通过调用`joinPoint.proceed()`,我们可以正常📝调用目标方法,并在方法执行后进行后续处理。###6.自定义切入点表达式好色先生允许开发者自定义复杂的切入点表达式,以满足不同的需求。例如,你可以根据多个条件组合来定义切入点:
java@Before("execution(*com.example.service..(..))&&args(id)&&@annotation(com.example.CustomAnnotation)")publicvoidbeforeMethodWithAnnotation(Longid){System.out.println("Methodwithid:"+id+"andcustomannotationstarted…");}
}
####8.3权限控制权限控制也可以通过AOP来实现,在方法调用前进行权限检查。
java@Aspect@ComponentpublicclassPermissionAspect{
@Before("execution(*com.example.service.*.*(..))&&@annotation(permission)")publicvoidcheckPermission(Permissionpermission){if(!hasPermission(permission.value())){thrownewSecurityException("Accessdenied");}}privatebooleanhasPermission(Stringpermission){//Implementpermissionchecklogicreturntrue;}
校对:魏京生(f3J1ePQDlzHhwh44q38w4Ima2E3XrDq)


