AOP的定义 AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。
面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术,如下图所示:
AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。
AOP的作用 AOP 采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。
主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入,增强代码的可读性和可维护性。
简单的说,AOP 的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。
AOP的应用场景 比如典型的AOP的应用场景:
日志记录 事务管理 权限验证 性能监测 AOP可以拦截指定的方法,并且对方法增强,比如:事务、日志、权限、性能监测等增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离。
Spring AOP的术语 在深入学习SpringAOP 之前,让我们先对AOP的几个基本术语有个大致的概念。
AOP核心概念 Spring AOP 通知分类
Spring AOP 织入时期
Spring AOP三种使用方式 AOP编程其实是很简单的事情,纵观AOP编程,程序员只需要参与三个部分:
1、定义普通业务组件
2、定义切入点,一个切入点可能横切多个业务组件
3、定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作
所以进行AOP编程的关键就是定义切入点和定义增强处理,一旦定义了合适的切入点和增强处理,AOP框架将自动生成AOP代理,即:代理对象的方法=增强处理+被代理对象的方法。
方式1:使用Spring自带的AOP public 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 创建被代理对象 通知(Advice) 切入点(Pointcut):通过正则表达式描述指定切入点(某些 指定方法) Advisor(高级通知) = Advice(通知) + Pointcut(切入点)
<!--注入通知-->
<property name="advice" ref="performanceAdviceBean"/>
</bean>
创建自动代理 *ServiceBean *TaskBean
<!--通知列表:需要执行那些通知-->
<property name="interceptorNames">
<list>
<value>logAdviceBean</value>
<value>performanceAdvisorBean</value>
</list>
</property>