Spring3 AOP深度解析:模块化横切关注点,降低耦合

需积分: 10 1 下载量 167 浏览量 更新于2024-07-22 1 收藏 485KB PDF 举报
"Spring3_AOP详解.pdf - 介绍Spring3中的AOP概念和技术,用于提升软件的模块化和可维护性,涉及降低模块耦合度、系统扩展性、设计的迟绑定以及代码复用性。" Spring3的AOP(面向切面编程)是面向对象编程的一个补充,它允许开发者定义“横切关注点”,即跨越多个对象和方法的通用功能,如事务管理、日志记录、权限控制等。AOP的核心思想在于,将这些关注点与核心业务逻辑分离,提高代码的可读性和可维护性。 AOP的主要好处包括: 1. **降低模块耦合度**:通过将横切关注点模块化,减少了业务逻辑与辅助功能之间的依赖关系,使得各个模块更加独立,易于理解和测试。 2. **系统容易扩展**:AOP使得新功能可以作为一个独立的切面添加,而不需改动原有代码,这样就降低了系统扩展时的复杂性。 3. **设计决定的迟绑定**:使用AOP,开发者可以在后期阶段决定如何实现特定需求,因为它们可以作为独立的切面进行插入,提供了更大的灵活性。 4. **更好的代码复用性**:通用的功能可以被封装成切面,在多个地方重复使用,避免了代码复制和粘贴,提高了代码的复用率。 以一个简单的例子来说明,比如在一个企业级应用中,有如下的层次结构: - **表现层**(负责用户交互) - **逻辑层**(处理业务逻辑) - **数据层**(处理数据访问) 在每个层级中,都有可能涉及到权限管理、日志记录和性能监控等通用功能。传统的做法是把这些功能分散到各个类和方法中,而使用AOP,我们可以将这些通用功能抽象出来,创建一个或多个切面来处理。例如,可以定义一个日志切面,当方法执行前后,自动记录相关日志;定义一个权限控制切面,用于检查用户是否有执行特定操作的权限。 在实际编程中,Spring3提供了基于代理的AOP实现,支持两种类型的代理:JDK动态代理和CGLIB代理。JDK动态代理适用于接口实现类,而CGLIB代理则可以针对没有实现接口的类。开发者可以通过配置XML或使用注解来定义切点(Pointcut)、通知(Advice)和切面(Aspect),实现AOP的功能。 Spring3的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 上传