我了解面向对象的编程,并且很长时间以来一直在编写OO程序。人们似乎在谈论面向方面的编程,但是我从来没有真正了解过它是什么或如何使用它。基本范式是什么?
这个问题是相关的,但并没有完全提出:
我了解面向对象的编程,并且很长时间以来一直在编写OO程序。人们似乎在谈论面向方面的编程,但是我从来没有真正了解过它是什么或如何使用它。基本范式是什么?
这个问题是相关的,但并没有完全提出:
Answers:
AOP解决了横切关注点的问题,横切关注点可能是在不同方法中重复的任何类型的代码,通常无法像日志记录或验证那样完全重构为自己的模块。因此,使用AOP,您可以将这些内容排除在主代码之外,并按如下方式垂直定义它:
function mainProgram()
{
var x = foo();
doSomethingWith(x);
return x;
}
aspect logging
{
before (mainProgram is called):
{
log.Write("entering mainProgram");
}
after (mainProgram is called):
{
log.Write( "exiting mainProgram with return value of "
+ mainProgram.returnValue);
}
}
aspect verification
{
before (doSomethingWith is called):
{
if (doSomethingWith.arguments[0] == null)
{
throw NullArgumentException();
}
if (!doSomethingWith.caller.isAuthenticated)
{
throw Securityexception();
}
}
}
然后使用aspect-weaver将代码编译为以下代码:
function mainProgram()
{
log.Write("entering mainProgram");
var x = foo();
if (x == null) throw NullArgumentException();
if (!mainProgramIsAuthenticated()) throw Securityexception();
doSomethingWith(x);
log.Write("exiting mainProgram with return value of "+ x);
return x;
}
从《春季行动》中复制
AOP通常被定义为一种促进软件系统中关注点分离的技术。系统由几个组件组成,每个组件负责特定的功能。但是,这些组件通常还承担核心功能以外的其他职责。诸如日志记录,事务管理和安全性之类的系统服务通常会进入组成其核心职责的组件。这些系统服务通常被称为跨领域关注点,因为它们倾向于跨越系统中的多个组件。
AOP可用于执行与应用程序的业务逻辑无关的操作,例如日志记录,缓存等。这些操作可放在应用程序的单独部分中,然后在整个应用程序中重复使用。通常有两种方法可以完成此任务。在方法之前/之后由预处理器自动注入代码,或附加代理类以拦截方法调用,然后可以在方法调用之前/之后执行操作。
这是.Net中的示例。它使用代理类拦截方法调用并在saif方法调用之后执行代码。
有一个AOP的例子,它以spring AOP为例。这个例子很容易理解。
Spring AOP(面向方面的编程)框架用于模块化方面的跨领域关注点。简而言之,它只是拦截某些进程的拦截器,例如,当方法执行时,Spring AOP可以劫持执行方法,并在方法执行之前或之后添加额外的功能。
参考:http : //www.mkyong.com/spring/spring-aop-examples-advice/