Spring入门(Schema-based AOP其一)

什么是AOP

AOP:Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
主要的功能是:日志记录、性能统计、安全控制、事务处理、异常处理等等。

举例说明,对于以上任意一种功能,以事务处理为例,我们希望任何数据库操作的方法,像update,insert,delete,我们不希望在每一个方法上自己手动地去开启事务,得到连接,提交事务再关闭连接。这样做成本大,开发效率低,所以希望有一种方式对于开发人员是透明的。执行到某一个方法,或者说某一类型具有某种特点的方法,或者是到某一层的类,比如说Service或者是以Service结尾的这种类的时候,我们就会开启这种事务控制,这就是一种实现统一维护的技术。这种技术实现的方式有两种,预编译方式和运行期动态代理的方式。这也就是AOP面向切面编程。

这里写图片描述
这张图来帮助理解切面。
比如说我们的系统中有产品管理、订单管理、服务管理等等,可以把它们叫做模块或者子功能。在任意一个子功能里,都需要记录它的日志,控制它的事务,以及进行安全验证这些功能。但是如果在每一个子功能中都去手工地去写这些日志、事务以及验证,那么工作量会非常大,尤其是当系统到达一定规模的时候,我们去进行一种修改,比如说日志记录的方式,格式需要调整,那么要去改每一个子模块中关于日志的功能,这个改动量太大。那么如果是通过这种切面的方式,对于开发人员是不可见的,我们默认的当执行任何一个子模块的时候,都会去记录它的日志。也就是说只有一处写了这种功能,一处实现就可以把它放在每一个功能执行的时候自动的以预编译的方式,或者是运行期动态代理的方式,去放在那块去执行这个功能。对开发人员是透明的,不需要知道有这样的功能的存在,这样对于我们的修改和管理都是非常方便的。
通过这张图还要注意一点,切面是和功能垂直的,也就是说,切面是横切于各个功能之上,通常我们开发的时候是关注这种横向的,比如产品管理,从前到后的整个生命周期,而切面正好和它是垂直的。无论是产品管理还是订单管理,都是关注他们在某一时刻或者是某一个过程执行点。

AOP的实现方式

预编译
-AspectJ
运行期动态代理(JDK动态代理、CGLib动态代理)
-SpringAOP、JbossAOP

AOP的几个相关概念

这里写图片描述
切面:比如说我们关注事务,那这个事务就是我们的关注点,它横切多个对象。这个对象如何理解?事务可以横切多个Service实现类的对象,也就是说在多个对象执行的过程中都被事务控制。
连接点:特定的点,有可能是一个类中的某个方法执行的开始等。
通知:按照刚才对于连接点的理解,通知就是就是这个方法执行的时候额外执行的我们的切面的动作。
切入点:就是我们如何在切面中去匹配一个具体的连接点。
引入:就像编译器动态修改class文件来为一个类增加新的属性和方法。
目标对象:比如说有一个订单的Service和一个商品的Service。切面会通知到所有的Service在执行到数据库操作的时候加上事务的控制,这两个Service就是目标对象。
AOP代理:它的最终目的就是用来执行切面的契约(包括通知方法执行等功能)。它是由AOP框架创建的对象,在我们开发的时候不知道它的存在,也不知道它究竟会被创建成什么样。
织入:就是把切面和对象关联起来,然后创建一个被通知的对象。

Advice的类型

这里写图片描述
回顾一下,Advice就是通知,是在切面的某个特定的连接点上执行的动作。
这个特定的连接点是什么样的?我们能否指定这个特定的连接点?图上已经给出了答案。

Spring框架中AOP的用途。

提供了声明式的企业服务,特别是EJB的替代服务的声明
允许用户定制自己的方面,以完成OOP与AOP的互补使用。

Spring的AOP实现

纯java实现,无需特殊的编译过程,不需要控制类加载器层次
目前只支持方法执行连接点(通知Spring Bean的方法执行)
不是wield提供最完整的AOP实现(尽管它非常强大);而是侧重于提供一种AOP实现和Spring IOC容器之间的整合,用于帮助解决企业应用中的常见问题
Spring AOP不会与AspectJ竞争,从而提供综合全面的AOP解决方案

有接口和无接口的Spring AOP实现区别

Spring AOP默认使用标准的JavaSE动态代理作为AOP代理,这使得任何接口(或者接口集)都可以被代理
Spring AOP中也可以使用CGLIB代理(如果一个业务对象并没有实现一个接口)

有接口的使用JavaSE动态代理,没有接口的使用CGLIB代理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值