图文详解Spring AOP,你学会了吗?
作者:系统运维 来源:IT科技类资讯 浏览: 【大中小】 发布时间:2025-11-05 11:54:15 评论数:
如果说 IOC 是图文 Spring 的核心,那么面向切面编程AOP就是详解P学 Spring 另外一个最为重要的核心.
本篇主要会详解以下六点:
1.AOP的定义
2.AOP的作用
3.AOP的应用场景
4.Spring AOP的术语
AOP核心概念Spring AOP 通知分类Spring AOP 织入时期5.Spring AOP三种使用方式
方式1:使用Spring自带的AOP方式2:使用Aspectj实现切面(普通POJO的实现方式)方式3:使用Aspectj实现切面(基于注解的实现方式)6.Spring AOP的实现原理
JDK动态代理JDK动态代理优缺CGLib代理CGLIB组成结构AOP的定义
AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是图文面向对象编程(OOP)的一种补充。
面向切面编程,详解P学实现在不修改源代码的图文情况下给程序动态统一添加额外功能的一种技术,如下图所示:

AOP可以拦截指定的详解P学方法并且对方法增强,而且无需侵入到业务代码中,图文使业务与非业务处理逻辑分离,详解P学比如Spring的图文事务,通过事务的详解P学注解配置,Spring会自动在业务方法中开启、图文提交业务,香港云服务器详解P学并且在业务处理失败时,图文执行相应的详解P学回滚策略。
AOP的图文作用
AOP 采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。
主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入,增强代码的可读性和可维护性。
简单的说,AOP 的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。
AOP的应用场景
比如典型的AOP的应用场景:

AOP可以拦截指定的方法,并且对方法增强,比如:事务、网站模板日志、权限、性能监测等增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离。
Spring AOP的术语
在深入学习SpringAOP 之前,让我们先对AOP的几个基本术语有个大致的概念。
AOP核心概念


Spring AOP三种使用方式
AOP编程其实是很简单的事情,纵观AOP编程,程序员只需要参与三个部分:
1.定义普通业务组件。
2.定义切入点,一个切入点可能横切多个业务组件。
3.定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作。
所以进行AOP编程的关键就是定义切入点和定义增强处理,一旦定义了合适的切入点和增强处理,AOP框架将自动生成AOP代理,即:代理对象的方法=增强处理+被代理对象的方法。
方式1:使用Spring自带的AOPpublic class LogAdvice implements MethodBeforeAdvice, AfterReturningAdvice,MethodInterceptor {
@Override
public void before(Method method, Object[] objects, Object target) throws Throwable {
//前置通知
}
@Override
public void afterReturning(Object result, Method method, Object[] objects, Object target) throws Throwable {
//后置通知
}
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
//环绕通知
//目标方法之前执行
methodInvocation.proceed(); //目标方法
//目标方法之后执行
return resultVal;
}
}配置通知时需实现org.springframework.aop包下的一些接口:
前置通知:MethodBeforeAdvice。亿华云后置通知:AfterReturningAdvice。环绕通知:MethodInterceptor。异常通知:ThrowsAdvice。创建被代理对象
Advisor(高级通知) = Advice(通知) + Pointcut(切入点)
创建自动代理
方式2:使用Aspectj实现切面(普通POJO的实现方式)
导入Aspectj相关依赖。
aspectjrt
aspectjweaver
通知方法名随便起,没有限制。
public class LogAspectj {
//前置通知
public void beforeAdvice(JoinPoint joinPoint){
System.out.println("========== 【Aspectj前置通知】 ==========");
}
//后置通知:方法正常执行后,有返回值,执行该后置通知:如果该方法执行出现异常,则不执行该后置通知
public void afterReturningAdvice(JoinPoint joinPoint,Object returnVal){
System.out.println("========== 【Aspectj后置通知】 ==========");
}
public void afterAdvice(JoinPoint joinPoint){
System.out.println("========== 【Aspectj后置通知】 ==========");
}
//环绕通知
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("##########【环绕通知中的前置通知】##########");
Object returnVale = joinPoint.proceed();
System.out.println("##########【环绕通知中的后置通知】##########");
return returnVale;
}
/
*** 异常通知:方法出现异常时,执行该通知
*/
public void throwAdvice(JoinPoint joinPoint, Exception ex){
System.out.println("出现异常:" + ex.getMessage());
}
}使用Aspectj实现切面,使用Spring AOP进行配置。
expression="execution(* com.apesource.service.impl.*.create*(..))"/>
来执行当前logAspectBean的doBefore-->
method="afterReturningAdvice" pointcut-ref="pointcut"/>
</aop:config>方式3:使用Aspectj实现切面(基于注解的实现方式)
//声明当前类为Aspect切面,并交给Spring容器管理
@Component
@Aspect
public class LogAnnotationAspectj {
private final static String EXPRESSION =
"execution(* com.apesource.service.impl.*.create*(..))";
//前置通知
@Before(EXPRESSION)
public void beforeAdvice(JoinPoint joinPoint){
System.out.println("========== 【Aspectj前置通知】 ==========");
}
//后置通知:方法正常执行后,有返回值,执行该后置通知:如果该方法执行出现异常,则不执行该后置通知
@AfterReturning(value = EXPRESSION,returning = "returnVal")
public void afterReturningAdvice(JoinPoint joinPoint,Object returnVal){
System.out.println("========== 【Aspectj后置通知】 ==========");
}
//后置通知
@After(EXPRESSION)
public void afterAdvice(JoinPoint joinPoint){
System.out.println("========== 【Aspectj后置通知】 ==========");
}
//环绕通知
@Around(EXPRESSION)
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("##########【环绕通知中的前置通知】##########");
Object returnVale = joinPoint.proceed();
System.out.println("##########【环绕通知中的后置通知】##########");
return returnVale;
}
// 异常通知:方法出现异常时,执行该通知
@AfterThrowing(value = EXPRESSION,throwing = "ex")
public void throwAdvice(JoinPoint joinPoint, Exception ex){
System.out.println("
