`
limaofa
  • 浏览: 24506 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

我们为什么需要AOP?

阅读更多

我们为什么需要AOP?

1.传统的面向对象有些什么缺点?

答:传统的面向对象编程把问题分成许多小的模块,但是因为模块之间有交互,所以不得不在对象中引入其他行为逻辑,比如说apache web服务器中的43个模块有39个依赖于验证逻辑,这些逻辑掺杂在一个类中,使我们阅读代码变得困难,因为这样会使类的职能变得晦涩不清。在原来,系统状态由很多全局变量控制,可是应用程序中的任意一行代码都可以修改这些全局变量,面向对象方法封装这些系统状态,把他们变成单独的对象,在这些对象中私有化系统状态,并且通过访问方法和逻辑来控制这些状态。尽管面向对象的这种封装带来了一定的好处,可是要把问题表示成完全模块化完全封装好的对象,还是存在一定困难,因为有些功能必须跨对象进行使用!而面向方面编程让你构建整洁的,封装好的对象没有多余的功能!

面向对象由于封装了属性的修改,不像原来谁都可以修改一些系统属性,这样我跟踪调试就很方便,因为你只需要跟踪谁调用了属性修改方法就可以了!

2.oop导致的问题?

答:(摘自精通aspectj

以下这段英文翻译过来很清晰的描述了oop所解决不了的问题,我简单解释一下就是,当我们需要添加新功能时,必须往已有的类中加入本来不属于他所关注的点的新代码,距离来说就是一个产品类,他本来只要关注自己的功能就可以,当为了满足系统的某项需求,比如在对产品赋予价格的方法的时候必须log下这个信息,本来这个log动作是应该由某个系统级的类抽象出来的,因为这属于系统级的功能,可是为了达到这个要求,我们必须在书或者其他产品类的setPrice()方法中额外加入log.write()类似的方法!你自己想想,一个类本来不应该对他外部世界做任何了解的,你打出log说明你已经了解别人肯定要用他了,这样封装性就不好,同时比如说书这种商品只需要关注属于自己的逻辑就行了,打印log算什么书的逻辑,跟书有关吗?真是混帐,这样我们就称类被系统中多个关注点横切了,因为系统的功能要求类这样做,唉,面向对象就是有这点很难解决的问题!还有类似那些计时统计记录的信息,身份验证要加进来的话,各种产品子类必须跟着团团转,作出相应的修改!

当某个需求导致代码纠缠时,我们就说该需求横切了系统,就像日志代码分散在tomcat的整个源代码中!横切并不总是系统的主要需求,这就像应用软件要正常运作也不一定需要日志功能,但在用户身份验证这种情况下确实要求横切!

AOP是Object Oriented Programming(OOP)的补充。

OOP能够很好地解决对象的数据和封装的问题,却不能很好的解决Aspect("方面")分离的问题。下面举例具体说明。

比如,我们有一个Bank(银行)类。Bank有两个方法,deposit(存钱)和withdraw(取钱)。

类和方法的定义如下:

//Code 2.1 Bank.java
class Bank{
public 
float deposit(AccountInfo account, float
 money){
  
// 增加account账户的钱数,返回账户里当前的钱数

}

public 
float withdraw(AccountInfo account, float
 money){
  
// 减少account账户的钱数,返回取出的钱数

}
};

这两个方法涉及到用户的账户资金等重要信息,必须要非常小心,所以编写完上面的商业逻辑之后,项目负责人又提出了新的要求--给Bank类的每个重要方法加上安全认证特性。

于是,我们不得不分别在上面的两个方法中加入安全认证的代码。

类和方法的定义如下:

//Code 2.2 Bank.java
class Bank{
public 
float deposit(AccountInfo account, float
 money){
  
// 验证account是否为合法用户

  // 增加account账户的钱数,返回账户里当前的钱数
}

public 
float withdraw(AccountInfo account, float
 money){
  
// 验证account是否为合法用户

  // 减少account账户的钱数,返回取出的钱数
}
};

这两个方法都需要操作数据库,为了保持数据完整性,项目负责人又提出了新的要求--给Bank类的每个操作数据库的方法加上事务控制。

于是,我们不得不分别在上面的两个方法中加入安全认证的代码。

类和方法的定义如下:

//Code 2.3 Bank.java
class Bank{
public 
float deposit(AccountInfo account, float
 money){
  
// 验证account是否为合法用户

  // Begin Transaction
  // 增加account账户的钱数,返回账户里当前的钱数
  // End Transaction
}

public 
float withdraw(AccountInfo account, float
 money){
  
// 验证account是否为合法用户

  // Begin Transaction
  // 减少account账户的钱数,返回取出的钱数
  // End Transaction
}
};

 

我们看到,这些与商业逻辑无关的重复代码遍布在整个程序中。实际的工程项目中涉及到的类和函数,远远不止两个。如何解决这种问题?

我们首先来看看OOP能否解决这个问题。

我们利用Design Pattern的Template Pattern,可以抽出一个框架,改变上面的例子的整个设计结构。

类和方法的定义如下:

//Code 2.4 Base.java
abstract class Base{
public 
float importantMethod(AccountInfo account, float
 money){
  
// 验证account是否为合法用户

  // Begin Transaction
  
  
float result =
 yourBusiness(account, money)

  
// End Transaction

  return result;    
}

protected abstract 
float yourBusiness(AccountInfo account, float
 money);
};

Code 
2.5
 BankDeposit.java
class BankDeposit extends Base{ 
protected 
float yourBusiness(AccountInfo account, float
 money){
  
// 增加account账户的钱数,返回账户里当前的钱数

}
};

Code 
2.6
 BankWithdraw.java
class BankWithdraw extends Base{ 
protected 
float yourBusiness(AccountInfo account, float
 money){
  
// 减少account账户的钱数,返回取出的钱数

}
};

这里我们用一种很勉强的方法实现了认证和事务代码的重用。而且,有心的读者可能会注意到,这种方法的前提是,强制所有的方法都遵守同样的signature。

如果有一个转账方法transfer(AccountInfo giver, AccountInfo receiver, float money),由于transfer方法的signature不同于yourBusiness的signature,这个方法无法使用上面的框架。

这个例子中提到的认证,事务等方面,就是AOP所关心的Aspect。

AOP就是为了解决这种问题而出现的。AOP的目的就是--Separation of Aspects (or Separation of Concerns).

分享到:
评论

相关推荐

    (入门)什么是AOP?什么是代理模式?怎么设计日志拦截器?

    【标题】:“(入门)什么是AOP?什么是代理模式?怎么设计日志拦截器?” 在编程领域,AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,它旨在提高代码的可重用性和模块化。AOP的核心思想是将...

    SpringAOP是什么?为什么要有SpringAOP?

    为什么需要Spring AOP呢? 1. **代码解耦**:通过将横切关注点从核心业务逻辑中分离出来,可以减少代码之间的耦合度,使得代码更易于理解和维护。 2. **重用性**:切面可以被多个对象共享,提高了代码的重用性,...

    44 Spring控制器Controller如何设置AOP?慕课专栏1

    为了解决这个问题,我们需要确保Controller和其他需要AOP处理的bean都在同一个ApplicationContext下,或者确保AOP配置能够覆盖到全局ApplicationContext。 有几种方法可以解决这个问题: 1. **将Controller移到`...

    aop介绍

    为什么需要 AOP? 使用 AOP 可以让我们从一个更高的抽象概念来理解软件系统,AOP 也许提供一种有价值的工具。可以这么说:因为使用 AOP 结构,现在 JBoss 4.0 的源码变得更加简洁、易维护、易扩展。 AOP 的优点 AOP...

    aop所依赖的所有包

    AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在减少代码的重复性和增强可维护性,特别是在处理系统中的横切关注点时。这些关注点,如日志、事务管理、安全检查等,往往分散在系统的各个部分...

    spring aop spring aop

    在实际应用中,我们需要在Spring配置文件(如`ApplicationContext.xml`)中启用AOP并声明切面。在给出的XML配置中,`<aop:config>`元素开启AOP支持,而`<aop:aspect>`元素用于定义切面,其内部通过`<aop:pointcut>`...

    spring-aop.jar各个版本

    spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...

    AOP需要的jar

    "基于Spring API的aop开发所需jar"这个标题暗示了我们需要一些特定的库来支持Spring AOP的实现。下面将详细介绍这些jar文件以及它们在Spring AOP中的作用: 1. **spring.jar**:这是Spring框架的核心库,包含了...

    spring-boot aop

    首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或关注点,如日志记录。切点(Pointcut)定义了在何处应用切面,通常通过方法签名或注解来指定。通知(Advice)是切面实际...

    AOP@Work AOP 工具比较

    面向切面编程(AOP,Aspect Oriented Programming)是一种编程范式,旨在通过将关注点分离,提高软件的模块化程度。AOP的核心是切面,它封装了横切关注...了解并比较这些工具,可以帮助我们更好地利用AOP提升软件质量。

    Spring AOP需要的jar

    首先,让我们了解一下什么是Spring AOP。AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它允许程序员定义“切面”,这些切面可以封装关注点,如日志、事务管理、安全性等,从而将这些关注点与...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    在使用反射实现AOP动态代理时,我们也需要注意一些问题。例如,由于代理类是在运行时动态创建的,这可能会影响程序的性能,特别是在频繁调用代理方法的情况下。因此,在实际开发中,需要根据应用场景的性能要求和...

    aop开发环境jar包

    当我们谈到“AOP开发环境jar包”时,通常是指一组能够支持AOP编程的库和工具,这些库包括Spring框架中的AOP模块或其他AOP实现。 描述中的“这个不会出现jar包版本不匹配问题,我可是弄了一天啊”可能意味着发布者...

    你真的了解AOP? 解读Spring Aop 官方文档(附视频)-附件资源

    你真的了解AOP? 解读Spring Aop 官方文档(附视频)-附件资源

    aop例子aop例子

    在Spring AOP中,我们首先需要定义一个切面(Aspect),它包含通知(Advice),即实际要执行的增强逻辑。通知类型有前置通知(Before)、后置通知(After)、返回后通知(After Returning)、异常后通知(After ...

    aopalliance-1.0.jar及aopalliance源码

    AOP Alliance是一个开源项目,它的全称是Aspect Oriented Programming(面向切面编程)Alliance,是Java平台上的一个接口集合,为面向切面编程的实现提供了一个统一的API。这个库的主要目的是为了在不同的AOP框架...

    Spring AOP面向方面编程原理:AOP概念

    在上面的示例中,我们定义了一个名为`LoggingAspect`的方面,其中包含了一个`logBefore`方法。通过`@Before`注解,我们可以指定此方法将在匹配`execution(* com.example.service.*.*(..))`表达式的任何方法调用之前...

    42 离开Spring AOP,我们如何实现AOP功能?慕课专栏1

    当我们的开发框架不是Spring或者其衍生框架时,使用Spring AOP就会变得复杂。这时,我们可以考虑其他方式来实现AOP功能。 首先,回顾一下代理模式。代理模式是一种经典的设计模式,它在不修改原有类的基础上,通过...

    开发工具 aopalliance-1.0

    开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具...

Global site tag (gtag.js) - Google Analytics