Spring AOP深度解析:面向切面编程的精髓

需积分: 9 0 下载量 95 浏览量 更新于2024-09-08 收藏 25KB DOCX 举报
"本文深入剖析了Spring AOP的概念、与OOP的关系以及AOP的核心概念,包括Aspect、Joinpoint、Advice和Pointcut等,并简要介绍了AOP的实现原理,包括静态AOP和动态AOP。" Spring AOP是Spring框架的重要特性,它引入了面向切面编程(AOP)的理念,作为面向对象编程(OOP)的一种补充。OOP关注于将业务实体的属性和行为抽象封装,而AOP则关注业务处理过程中的独立步骤或阶段,以降低模块间的耦合度,提高代码的灵活性和可扩展性。 面向切面编程(AOP)的主要目标是解决横切关注点的问题,即那些跨越多个对象、类或方法的共同关注点,如日志、事务管理和权限控制等。AOP通过将这些关注点与核心业务逻辑分离,使得代码更易于维护和扩展。例如,员工类(Employee)的OOP实现关注于员工属性和行为,而权限检查则更适合用AOP处理。 OOP和AOP并不是互相排斥的。虽然理论上AOP的一些功能可以通过良好的OOP设计实现,但AOP提供了更优雅的解决方案,特别是在处理横切关注点时。OOP接口可能需要在各个模块中显式调用,而AOP允许在适当的时间自动执行相关操作,减少了对代码的侵入性。当接口需要修改时,AOP的改变通常更加局部,不会像OOP那样引起大规模的连锁反应。 AOP中的关键概念包括: 1. Aspect(切面):一个关注点的模块化,它可以包含若干个通知和切点定义。 2. Joinpoint(连接点):程序执行的特定点,如方法调用、异常抛出等。 3. Advice(通知):在特定连接点执行的动作,有Before、After Returning、After Throwing、After(Finally)和Around五种类型。 4. Pointcut(切点):匹配一组连接点的表达式,定义了通知将在何处执行。 AOP的实现原理分为静态AOP和动态AOP。静态AOP,如AspectJ,是在编译时或构建时织入(Weave)切面,使代码与切面紧密结合。动态AOP,如Spring AOP,是在运行时织入,通过代理机制实现切面的插入,无需修改原始代码。 Spring AOP主要通过两种类型的代理实现:JDK动态代理和CGLIB代理。JDK动态代理适用于实现了接口的类,而CGLIB代理则用于未实现接口的类。这些代理使得Spring可以在方法调用前后自动插入通知,实现AOP的功能。 总结来说,Spring AOP提供了一种强大的工具,用于管理和实施横切关注点,增强了代码的可维护性和模块化。结合OOP,开发者可以更好地组织和设计复杂的应用程序,提高软件的可重用性和可扩展性。

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 上传