AOP的前景引入:在传统的面向对象编程中,如果我们定义一个接口,接口里面有1.2.3.4个抽象方法,然后有10个接口实现类,如果想要在接口方法3之前新增一个方法并且一定得在方法3之前执行,我们传统做法是在每一个实现类的方法3之重新重写这个方法,这种方法的弊端特别明显就是如果我们有很多个实现类每一个去修改很麻烦,然后我们就引入AOP去解决这种复杂并且高耦合的代码
AOP的相关名词
AspectJ:一个开源的专门做aop的框架,spring框架中集成了这个框架,可以直接通过spring直接使用这个框架(spring主要是在事务处理时使用aop,项目开发中很少使用spring的aop,因为spring中aop比较笨重)
切面(Aspect):一个模块功能的模块化,这个功能可能横切多个对象。其实我们上面的新增方法就是一个切面
切入点(Pointcut):可以插入横切逻辑的方法。我们说新增方法在方法3之前,方法3就是一个切入点方法。
连接点JoinPoint:连接点,连接业务方法和切面的位置。
通知(Advice):
前置通知(Before Advice):在切入点方法执行之前。
后置通知(After Advice):在切入点方法执行之后。
异常通知(After Throwing Advice):在切入点方法抛出异常。
最终通知(After FinallyAdvice): 当切入点方法执行完毕时(不论正常发挥还是异常退出)
环绕通知(Around Advice):可以贯穿切入点方法执行的整个过程。
在Java基础的时候我们知道一个普通类要想变成一个特殊类有两种方法:extends一个类或者实现一个接口(或者注解跟配置文件)。在AOP中也是一样我们要让一个普通类变成通知就得。
前置通知需要实现org.springframework.aop.MethodBeforeAdvice接口(接口方法before())
后置通知需要实现org.springframework.aop.AfterReturningAdvice接口(接口方afterReturning())
异常通知需要实现org.springframework.aop.ThrowsAdvice接口(无)
环绕通知需要实现org.aopalliance.intercept.MethodInterceptor接口(接口方法invoke())
下面我们利用AOP基于XML配置文件来更加深入理解
首先我们要导入两个跟Aop有关的jar包: aopalance.jar aspectjweaver.jar
然后创建一个通知类(实现各自匹配的接口)
然后在spring配置文件中配置切入点跟切面类的连接(在标签里面配置AOP相关的)
import java.lang.reflect.Method; public class Logger implements MethodBeforeAdvice { @Override public void before(Method method, Object[] args,Object[] args) throws Throwable { System.out.println("前置通知......."); //说一下before几个参数的意思 Object[] args:这个对象就是切入点所在的对象 Method method:这个参数就是切入点方法 Object[] args 这个参数就是切入点方法中的参数 } }
这里就是切面通知类
在这里一下expression表达式的几种写法
这个expression里面填写就是切入点方法相关的修饰符,返回值类型 全类名.方法(参数)
环绕通知:在切入点方法的前后,异常发生时,最终等各个地方都可以进行通知,最强大的一个通知。
还可以获取切入点方法全部控制器(目标方法是否执行,执行之前,执行之后,参数,返回值等)
在使用环绕通知,目标方法的一切信息都可以通过invocation参数获取到
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)