基于Java的AOP编程技术详解

需积分: 13 1 下载量 66 浏览量 更新于2024-07-25 收藏 1.31MB PDF 举报
Java Spring Day02 - AOP 编程 本节课程主要介绍了 Aspect-Oriented Programming(AOP)编程的基本概念和应用,包括 AOP 的定义、AOP 相关概念、通知类型、切入点表达式等。 **什么是 AOP 及其好处** AOP(Aspect-Oriented Programming)是面向方面编程或面向切面编程,关注点是共同处理,可以通过配置将其作用到某一个或多个目标对象上。AOP 的好处是实现组件重复利用,改善程序结构,提高灵活性,将共通组件与目标对象解耦。 **AOP 相关概念** 1. Aspect(切面):指的是共通业务处理,可以切入到多个目标对象,可多次使用。 2. JoinPoint(连接点):指的是切面组件在目标对象上作用的位置,例如:方法上或发生异常。 3. Pointcut(切入点):切入点是连接点的集合,采用表达式指定。 4. TargetObject(目标对象):目标对象是指被切面组件所作用的对象。 5. Advice(通知):指的是切面组件在连接点上执行的动作,例如:在方法调用前、方法调用后、方法调用前后等。 6. AutoProxy(动态代理):采用了 AOP 之后,容器返回的对象是代理对象。用户在使用时,由代理对象调用切面组件和目标对象的功能。 **通知类型** 通知类型是 AOP 中的一种重要概念,共有五种: 1. Before Advice(前置通知):在目标对象的方法调用前执行。 2. After Advice(后置通知):在目标对象的方法调用后执行。 3. Around Advice(环绕通知):在目标对象的方法调用前和调用后执行。 4. Throws Advice(异常通知):在目标对象的方法调用时抛出异常时执行。 5. After Returning Advice(返回通知):在目标对象的方法调用后返回时执行。 **切入点表达式** 切入点表达式是 AOP 中用来指定切入点的表达式,例如: execution(* *(..)),指定所有方法的切入点。 **AOP 演示** 在 Spring 框架中,AOP 的实现是通过 AspectJ 库来实现的,需要导入相关的 Jar 包,例如:aspectjrt.jar 和 aspectjweaver.jar。同时,为了实现动态代理,需要导入 cglib.jar。 在演示中,我们新建了一个 Spring 项目,创建了一个 UserService 接口和实现类,并使用 AOP 来实现日志记录功能。

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.sitech.prom.channelsettle.rehearsal.busi.compute.vo.DatasyncJobIdDatasyncStatusVo at com.sitech.prom.channelsettle.rehearsal.busi.compute.scheduler.TimeScanRemoteScheduler.fiveMinExecute(TimeScanRemoteScheduler.java:149) ~[classes!/:1.0] at sun.reflect.GeneratedMethodAccessor255.invoke(Unknown Source) ~[na:na] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_161] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_161] at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) ~[spring-context-5.2.6.RELEASE.jar!/:5.2.6.RELEASE] at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.2.6.RELEASE.jar!/:5.2.6.RELEASE] at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93) [spring-context-5.2.6.RELEASE.jar!/:5.2.6.RELEASE] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_161] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_161] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_161] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_161] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_161] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_161] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_161]

2023-06-06 上传