Spring AOP:背景、问题与AspectJ/SpringAOP解决方案

需积分: 9 0 下载量 47 浏览量 更新于2024-08-05 1 收藏 1.61MB DOCX 举报
本文档深入探讨了Spring AOP(面向切面编程)的原理、背景及其在解决软件开发中复杂性问题中的应用。随着软件系统的复杂度增加,传统的面向对象(OOP)编程模式中,诸如日志记录、权限验证、事务控制和性能检测等非核心业务逻辑往往与核心业务混杂在一起,导致代码混乱、重复和扩展性降低。AOP的引入旨在通过分离关注点,使核心业务专注于自己的功能,而将通用的业务逻辑(如切面)横切到多个核心模块中。 AOP的基本思想是“关注点分离”,即将那些与业务无关但对多个业务模块都必要的功能,如权限检查、事务管理,抽取出来作为一个独立的模块,称为“切面”或“切点”。通过定义切点、通知(何时执行)、通知类型(前置通知、后置通知等),AOP能够灵活地控制何时何地执行这些切面,从而实现代码的整洁和可维护性。 文档中提到了AOP在Spring框架中的实现,SpringAOP是Spring框架的一个关键特性,它利用了Spring的依赖注入和配置机制来支持AspectJ,使得AOP在Spring应用中更为便捷。AspectJ本身是一个底层的字节码操作工具,允许开发者直接操作Java字节码,提供更高级别的灵活性,而SpringAOP则是在其之上提供了一层更易于使用的API。 AOP的体系结构包括三个关键元素:切点(where to intercept)、通知(when to execute)和连接点(join point)。切点定义了在哪段代码中执行切面,通知决定了何时执行(例如,方法调用前后),而连接点则是通知实际起作用的时机。通过这种方式,AOP实现了模块化和代码复用,降低了代码的耦合度,提高了代码质量并简化了模块间的通信。 总结来说,Spring AOP是一种强大的设计模式,它通过将横切关注点从核心业务中剥离,帮助开发者编写更清晰、更易于维护的代码。通过理解AOP的基本概念、如何在Spring中应用它,以及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 上传