面向切面编程之研究与探讨

今天看了李丽萍的关于面向切面编程的文章,有些东西想记录下来。

面向切面编程主要是为了解决程序中的一些不核心但是却很重要的辅助功能的设计问题。除了业务逻辑外,在一个完整的系统中,必定有记录平时系统运行时抛出的异常, 需要我们去记录, 以便我们对系统尽快地修复, 这就是我们常用的日志。 如果对一些要求比较重要的数据操作, 事务是不可少的, 如金融系统, 这样的数据很重要, 每步操作都很重要, 我们就应该用到事务处理。这就是我们常用的事务处理。可根据你的系统数据的重要性,有选择地应用。还有一个常用的就是安全验证了, 它也是常用的, 对于不同的页面, 访问的身份也不一样。 这就是我们常用的身份验证。 以上这些不是针对特定哪个业务模块的, 可能针对所有的模块。它们只是一些附加的功能, 相对模块的主功能而言, 如果在每个模块中都夹杂着这些不是核心业务的代码,看起来与核心业务有点关系, 但这样处理, 会对以后的维护比较头疼。同时也违背了面向对象的一条原则, 自己对自己负责, 本不属于这个方法的业务也放在了其中。 这样的代码不仅难维护, 重用性也不好, 耦合度也比较大, 内聚性也比较低。 这样的代码眼前可能不会有什么麻烦, 但给后期的维护人员带来了麻烦。由于 AOP 技术本身的插件式特点, 采用这种机制进行系统设计和程序开发能够为软件带来极大的灵活性和扩展性。
目前, 运用 AOP 对系统进行功能扩展主要关注的方面是: 1、 Trans-actions 事务, 2、 logging 日志, 3、 性能分析和监控, 4、 权限, 包括鉴权、 安全控制等, 5、 缓存, 6、 错误处理, 7、 性能优化等等。 比如我们最常见的就是日志记录了, 举个例子, 我们现在提供一个服务查询学生信息的, 但是我们希望记录有谁进行了这个查询。如果按照传统的 OOP 实现的话, 那我们实现了一个查询学生信息的服务接口(StudentInfoService)和其实现类 (StudentInfoServiceImpl.java ) , 同时为了要进行记录, 那我们在实现类(StudentInfoServiceImpl.java)中要添加其实现记录的过程。这样的话, 假如我们要实现的服务有多个呢? 那就要在每个实现的类都添加这些记录过程。 这样做就会有点繁琐, 而且每个实现类都与记录服务日志的行为紧耦合, 违反了面向对象的规则。 那么怎样才能把记录服务的行为从业务处理过程中分离出来呢?看起来好像就是查询学生的服务自己在进行, 但是背后日志记录对这些行为进行记录, 但是查询学生的服务不知道存在这些记录过程, 这就是我们要讨论 AOP 的目的所在。 AOP的编程,好像就是把我们在某个方面的功能提出来与一批对象进行隔离, 这样与一批对象之间降低了耦合性, 可以就某个功能进行编程。我们直接从代码入手, 要实现以上的目标, 我们可以使用一个动态代理类
(Proxy), 通过拦截一个对象的行为并添加我们需要的功能来完成。

在系统的设计中,应该将业务的核心关注点与系统横切关注点分开。横切关注点的划分通常满足下面的3个条件:

1、关注点要实现的功能往往横跨了多个模块

2、关注点与核心业务相互独立,不属于同一问题域

3、关注点一般不属于系统的业务功能范畴。


学习aop ,首先要了解下面几个概念

1、连接点(Joinpoint)

连接点是指一个类,一段代码拥有边界性质的特定点,比如,类的初始化前,类的初始化后,某个方法调用前,某个方法调用后,方法抛出异常后这些位置。spring仅支持方法的连接点,即仅能在方法的调用前,方法调用后,方法抛出异常执行织入。我们知道黑客在攻击系统的时候需要找到突破口,没有突破口就没法进行攻击。因此,从某种程度上说,AOP算是一个黑客(因为它要向目标类中嵌入额外的代码逻辑),而连接点就是AOP向目标类中打入锲子的候选点。

2、切点(pointcut)

每个类都拥有多个连接点。比如一个类有两个方法,这两个方法都是连接点。在众多的连接点中,AOP通过切点来定位到特定的连接点。 举个形象的例子,通过数据库查询的概念来理解切点和连接点的关系:连接点相当于数据库中的记录,而切点相当于查询的条件,切点和连接点并不是一对一的条件,一个切点可以匹配多个连接点。

在Spring中,切点通过org.springframwork.aop.Pointcut接口进行查询,他使用类和方法作为连接点的查询条件。spring aop 的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。确切说,并不是连接点,因为连接点是方法执行前,执行后等包括方位信息的具体程序执行点,而切点只能定位到某个方法上,所以说,如果要定位到某个方法上,还需要提供方位信息。

3、增强(Advice)

增强就是目标类中的连接点中织入的一段代码,像黑客一样,往业务逻辑中装入木马。spring中,增强除了用于描述一段程序代码之外,还拥有另一个和连接点相关的信息,这边是执行点的方位。结合执行点方位信息和切点信息,就可以找到特定的连接点了。正因为增强包含了用于添加到目标连接点的一段执行逻辑,又包含了用于定位连接点的方位信息,所以spring提供的接口都是带方位名的: BeforeAdvice(表示方法调用前的位置)   AfterReturningAdvice(表示访问返回后的位置)  ThrowsAdvice 等。只有结合切点和增强 才能确定特定的连接点并实施增强逻辑。

4、目标对象(Target)

增强逻辑的织入类。如果没有AOP,目标业务类需要自己实现所有的逻辑,而在AOP的帮助下,我们只需实现那些非横切逻辑的程序逻辑,而性能监视和事务管理这些横切逻辑则可以使用AOP动态织入特定的连接点上。

5、引介(Introduction)

引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过AOP的引入功能,也可以动态地为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。

6、织入(weaving)

织入是将增强添加到目标类具体连接点上的过程,AOP像一台织布机,将目标类、增强或者引介通过AOP这台织布机编织到一起。根据不同的实现技术,大致有3种织入方式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值