深入理解Spring AOP:概念与术语解析

版权申诉
0 下载量 56 浏览量 更新于2024-08-03 收藏 38KB DOCX 举报
"深入理解Spring AOP的关键概念和技术" Spring AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它与传统的面向对象编程(Object-Oriented Programming,OOP)相结合,为软件开发提供了新的视角。在OOP中,我们关注的是类和对象,而在AOP中,核心概念是切面(Aspect)。切面包含了业务逻辑中横切关注点的封装,这些关注点通常会影响到多个对象或方法。 **切面(Aspect)** 切面是AOP的核心,它由两个主要部分组成:切点(Pointcut)和通知(Advice)。切面定义了关注点以及它们在何时何地应用。在Spring AOP中,我们可以通过使用`@Aspect`注解来声明一个类作为切面,这个类将包含切点和通知的定义。 **通知(Advice)** 通知是在满足切点规则的特定连接点(Joinpoint)上执行的代码片段。Spring AOP通常将通知模拟为拦截器,可以在连接点前后插入多个通知,形成一个拦截链。例如,当我们想实现HTTP请求的鉴权功能,可以为所有使用`@RequestMapping`注解的方法添加一个通知,当请求到达时,首先执行这个通知,检查请求的权限,如果权限允许,则继续执行控制器方法,否则抛出异常。这样,通知就起到了拦截和验证的作用。 **连接点(Joinpoint)** 连接点是程序执行过程中的一个点,如方法的执行、异常的抛出等。在Spring AOP中,最常见的连接点是方法的执行,即方法调用时刻。开发者可以通过定义切点表达式来指定哪些连接点需要应用通知。 **切点(Pointcut)** 切点是连接点的集合,定义了通知将在哪些连接点上应用。切点表达式是用于匹配连接点的条件,通常使用正则表达式或预定义的注解来定义。例如,`@Before("execution(* com.example.service.*.*(..))"`表示在`com.example.service`包下的所有类的所有方法执行前应用通知。 **织入(Weaving)** 织入是将切面的逻辑与应用程序代码结合的过程,这个过程可以在编译时、加载时或运行时完成。Spring AOP默认采用代理方式在运行时织入,通过动态生成代理对象来实现对目标对象的拦截和通知的执行。 在实际应用中,Spring AOP提供了五种不同类型的通知: 1. 前置通知(Before Advice):在目标方法执行之前运行。 2. 后置通知(After Returning Advice):在目标方法成功执行后运行。 3. 异常后通知(After Throwing Advice):在目标方法抛出异常后运行。 4. 最终通知(After (Finally) Advice):无论目标方法是否正常结束,都会执行。 5. 环绕通知(Around Advice):包裹整个目标方法的执行,可以在方法调用前后自由添加自定义逻辑。 掌握这些基本概念后,开发者可以利用Spring AOP有效地管理横切关注点,提高代码的可复用性和可维护性,使得业务逻辑更加清晰。在实际项目中,AOP常用于日志记录、事务管理、安全控制等场景,通过切面编程,可以将这些横切关注点从核心业务逻辑中分离出来,提高代码的模块化程度。

java.lang.NullPointerException: null at com.datech.web.controller.system.TbappController.remove(TbappController.java:667) at com.datech.web.controller.system.TbappController$$FastClassBySpringCGLIB$$ea1c3ba.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:62) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:55) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82) at org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39) at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:115) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) at com.datech.web.controller.system.TbappController$$EnhancerBySpringCGLIB$$b3b02033.remove(<generated>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

2023-07-14 上传

com.cxm.common.exception.CxmServiceException: 获取日结单数据出错 at com.cxm.service.report.DailyStatManager.reconciliationIndex(DailyStatManager.java:203) at com.cxm.api.report.DailyStatApi.reconciliationIndex(DailyStatApi.java:102) at com.cxm.api.report.DailyStatApi$$FastClassBySpringCGLIB$$4bcc5350.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:769) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88) at com.cxm.log.CxmLogbackAspect.doAround(CxmLogbackAspect.java:98) at sun.reflect.GeneratedMethodAccessor365.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)

2023-06-01 上传
2023-06-03 上传