Spring AOP详解:切面、通知与代理深入理解

版权申诉
0 下载量 118 浏览量 更新于2024-08-08 收藏 40KB DOCX 举报
Spring AOP(面向切面编程)是一种编程范式,用于将应用程序中常见的关注点,如日志、事务管理、权限控制等系统层面的问题,通过分离和重用的方式进行管理。本文将深入介绍AOP的基本概念和在Spring框架中的应用。 首先,AOP的核心概念包括: 1. **切面(Aspect)**:切面是一个特殊的类,它包含了一组相关的横切关注点,如日志记录、事务管理等。切面内部定义了切入点(Pointcuts)和通知(Advises)。 2. **连接点(JointPoint)**:在程序执行过程中,诸如方法调用的明确点,是AOP干预的时机。 3. **通知(Advice)**:通知是AOP的主要行为,根据执行时机的不同,分为: - `before`:在目标方法调用前执行。 - `afterReturning`:在方法正常执行完毕后执行,可以访问返回值。 - `afterThrowing`:处理方法抛出的异常后执行,允许访问异常对象。 - `after`:无论方法执行结果如何,都在方法执行后执行。 - `around`:环绕通知,围绕目标方法执行前后进行增强,最灵活的执行策略,常用于实现事务和日志管理。 4. **切入点(Pointcut)**:表达式形式的规则,用于确定何时应用通知。这些表达式定义了通知应该何时执行。 5. **AOP代理**:AOP框架创建的对象,是目标对象的增强版本。Spring支持两种代理模式: - **JDK动态代理**:基于接口,当需要代理类而非接口时,Spring默认使用这种方式。 - **CGLIB代理**:基于子类,当需要代理类的行为时,Spring会根据需要选择CGLIB。 在Spring框架中,AOP代理与IoC容器紧密集成,代理的生成、管理和依赖关系由Spring IoC容器负责。Spring默认使用JDK动态代理,但在必要时,会自动切换到CGLIB代理。 此外,Spring还提供了基于注解的AOP配置方式,例如通过启用`@AspectJ`支持,可以方便地在`applicationContext.xml`中配置通知类型,如`@Before`、`@AfterReturning`、`@AfterThrowing`等,这些注解帮助开发者更简洁地表达AOP逻辑,提高代码的可读性和维护性。 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 上传