Spring AOP 之概念

binggege 2017-01-02

Spring AOP 之概念

为什么使用AOP?

      1. 节省代码,加了切面统一完成特定操作,不用每个类都去写

      2. 为了机构更清晰,代码集中在的业务上,其他事情(安全、事务、日志)让切面完成

实现AOP的技术,主要分为两大类:

      1. 采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;

      2. 采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。

AOP使用场景

      Authentication 权限

      Caching 缓存

      Context passing 内容传递

      Error handling 错误处理

      Lazy loading 懒加载

      Debugging  调试

      logging, tracing, profiling and monitoring 记录跟踪 优化 校准

      Performance optimization 性能优化

      Persistence  持久化

      Resource pooling 资源池

      Synchronization 同步

      Transactions 事务

      1. 性能监控:在方法调用前后记录调用时间,方法执行太长或超时报警。

      2. 缓存代理:缓存某方法的返回值,下次执行该方法时,直接从缓存里获取。

      3. 软件破解:使用AOP修改软件的验证类的判断逻辑。

      4. 工作流系统:工作流系统需要将业务代码和流程引擎代码混合在一起执行,可以使用AOP将其分离,并动态挂接业务。

      5. 权限验证:方法执行前验证是否有权限执行当前方法。

      6. 方法调用成功后——>统计调用次数——>存入缓存服务器——>每日存入数据库

         因为每天的方法调用次数近百万,为了降低数据库压力不能实时入库。

      7. 事务:在监控的方法前后加环绕通知,前通知负责记录SQL,后通知负责提交事务或回滚。


Spring AOP 之概念
 

spring的术语

Advice(通知)

在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。Spring中定义了四个advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice

Aspect(切面)

是个类,类里写了想要横切进去的逻辑。

JoinPoint(连接点)

可以在系统中织入横切逻辑的位置

PointCut(切入点)

是表达式,用来描述系统中所有需要织入横切逻辑的 Joinpoint 的集合 

introduction(引入)

允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗

Target Object(目标对象)

被一个或多个切面所通知的对象。Spring AOP通过运行时代理实现,因此,这个对象永远是一个被代理对象。

AOP Proxy(AOP代理)

AOP框架创建的对象,用来实现你想要的切入功能。Spring中,AOP代理是JDK动态代理或者CGLIB代理。

Weave(织入)

把切面连接到其他的应用程序类型或者对象上,并创建一个被通知对象。织入可以在编译时,类加载时和运行时完成,Spring是在运行时完成的。


Spring AOP 之概念
 

开发中与代码有关的就是

   1. 切面

   2. 通知

   3. 切入点

各种通知(Advice)类型

Before advice:在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。

ApplicationContext中在<aop:aspect>里面使用<aop:before>元素进行声明。

After advice:当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。

ApplicationContext中在<aop:aspect>里面使用<aop:after>元素进行声明。

After returnadvice:在某连接点正常完成后执行的通知,不包括抛出异常的情况。

ApplicationContext中在<aop:aspect>里面使用<aop:after-returning>元素进行声明。

Around advice:包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。

ApplicationContext中在<aop:aspect>里面使用<aop:around>元素进行声明。

Afterthrowing advice:在方法抛出异常退出时执行的通知。

ApplicationContext中在<aop:aspect>里面使用<aop:after-throwing>元素进行声明。


Spring AOP 之概念
 

AOP 2种代理的区别

      1. JDK基于接口实现:JDK动态代理对实现了接口的类进行代理。

      2. CGLIB基于继承:CGLIB代理可以对类代理,主要对指定的类生成一个子类,因为是继承,所以目标类最好不要使用final声明。 

       

      通常情况下,鼓励使用jdk代理,因为业务一般都会抽象出一个接口,而且不用引入新的东西。如果是遗留的系统,以前没有实现接口,那么只能使用CGLIB。

参考:

http://www.myexception.cn/software-architecture-design/925289.html

http://www.th7.cn/Program/java/2012/03/03/62048.shtml 

http://blog.csdn.net/moreevan/article/details/11977115/

http://blog.csdn.net/dreamthen/article/details/26687727

http://blog.csdn.net/xiaoxian8023/article/details/17225339

相关推荐