这几天公司前辈问我了解aop吗,说实话我对这个的印象和理解不是很深,就是单纯的觉得aop就是在你调用一个方法的时候在在前或之后触发调用其他的功能或程序 。所以今天我在网上找了些看看。
org.springframework.aop.BeforeAdvice 代表前置增强,因为spring只支持方法级的增强,所以MethodBeforeAdvice 是目前可用前置增强,表示在目标方法执行前实施增强。
AfterAdvice 代表后置增强,表示目标方法在执行后实施增强
MethodInterceptor 代表环绕增强,表示目标方法执行前后实施增强
ThrowsAdvice 代表抛出异常增强,表示目标方法抛出异常后实施增强
IntroductionInterceptor 代表引介增强,表示在目标类中添加一些新的方法和属性
aop在java中是根据反射机制实现的(你也可以认为是动态代理,不过动态代理也是反射机制实现的)
比如说在其中一个业务流程中需要验证账户密码 同时在另外一个业务中也需要验证账号密码。这个时候我们可以考虑下把账户密码提取出来 ,在写这个代码的时候不考虑账户密码的验证步骤,写完之后在另外一个地方,写好验证用户的代码然后告诉Spring你要把这段代码加到哪几个地方,Spring就会帮你加过去,而不要你自己Copy过去,这里还是两个地方,如果你有多个控制流呢,这个写代码的方法可以大大减少你的时间,不过AOP的目的不是这样,这只是一个“副作用”,真正目的是,你写代码的时候,事先只需考虑主流程,而不用考虑那些不重要的流程,懂C的都知道,良好的风格要求在函数起始处验证参数,如果在C上可以用AOP,就可以先不管校验参数的问题,事后使用AOP就可以隔山打牛的给所有函数一次性加入校验代码,而你只需要写一次校验代码。不知道C的没关系,举一个通用的例子,经常在debug的时候要打log吧,你也可以写好主要代码之后,把打log的代码写到另一个单独的地方,然后命令AOP把你的代码加过去,注意AOP不会把代码加到源文件里,但是它会正确的影响最终的机器代码。
原博客:
https://www.cnblogs.com/Wolfmanlq/p/6036019.html
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子。
AOP的基本概念
(1)Aspect(切面):通常是一个类,里面可以定义切入点和通知
(2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用
(3)Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around
(4)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
(5)AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类
AOP常用的实现方式有两种:一种是采用声明的方式来实现(基于XML),一种是采用注解的方式来实现(基于AspectJ)。
基于注解的AOP配置方式
1.启用@AsjectJ支持
在applicationContext.xml中配置下面一句:
<aop:aspectj-autoproxy />
通知类型介绍
(1)Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可
(2)AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值
(3)AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名
来访问目标方法中所抛出的异常对象
(4)After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式
(5)Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint
原博主:https://www.cnblogs.com/liuruowang/p/5711563.html
或者:https://www.cnblogs.com/xiaoxi/p/5981514.html