MeB*_*Guy 27
AOP是一种修改代码库中现有类的方法,用于修饰它们或根据单独定义的规则更改其行为.这种修改可以在将类放入jar/war之前完成,也可以在加载代码时动态发生.
我们的想法是,您不是在源代码中找到要修改的所有代码点并手动修改它们,而是定义如何在代码库中查找兴趣点的规则,以及您希望对代码执行哪些修饰.他们.这些规则称为方面(的一个的AOP).
原型示例是您希望获得有关代码库中各种方法的时序信息.您可以找到所有感兴趣的方法,并在顶部拨打电话
long start = System.currentTimeMillis();
Run Code Online (Sandbox Code Playgroud)
最后呢
long end = System.currentTimeMillis();
System.out.println("Method time is: " + (end - start));
Run Code Online (Sandbox Code Playgroud)
但那是:
您可以改为定义要说明要修改哪些方法的方面,以及要在这些方法的开头和结尾处执行操作的方面.
当应用AOP时,无论是在jar创建时还是在类加载时,都就像你最初编写类一样.
面向切面编程是一个全新的概念,它不是面向对象编程的替代品。事实上,AOP 是组织程序结构的另一种方式。
为了更清楚,我将使用一些图表:
什么是方面?
|---------------------|------------------|------------------|
| Aspect = Point cut + Advice |
|---------------------|------------------|------------------|
| | Where the aspect | What code is |
| | is applied | executed. |
|---------------------|------------------|------------------|
Run Code Online (Sandbox Code Playgroud)
方面 = 切入点 + 建议
建议方法的类型
方面示例
@Around( "execution(* *(..))" )
public Object trace(ProceedingJoinPointproceedingJP)throwsThrowable{
String methodInformation= proceedingJP.getStaticPart().getSignature().toString();
logger.trace("Entering "+methodInformation);
try{
returnproceedingJP.proceed();
} catch(Throwable ex) {
logger.error("Exception in "+methodInformation, ex);
throw ex;
} finally {
logger.trace("Exiting "+methodInformation);
}
}
Run Code Online (Sandbox Code Playgroud)AOP是用于模块化横切特征的图案.因此,如果某个"事物"适用于您的代码中的重要部分,那么您可以使用AOP来解决该问题.这些"事物"被称为方面.
以下示例:
跨企业应用程序使用异常记录器.因此,您可以通过以下方式使用AOP进行设置.所以现在my.service包下的所有方法都将按以下方式记录.
<bean id="exceptionLogger" class="my.good.ExceptionLogger" />
<aop:config>
<aop:pointcut id="allServiceMethods" expression="execution(* my.service.*(..))" />
<aop:aspect id="serviceLogger" ref="exceptionLogger">
<aop:after-throwing pointcut-ref="allServiceMethods"
method="logIt"
throwing="e"/>
</aop:aspect>
</aop:config>
Run Code Online (Sandbox Code Playgroud)
ExceptionLogger类可能如下所示: -
public class ExceptionLogger {
private static Logger logger = Logger.getLogger(ExceptionLogger.class);
public void logIt(JoinPoint jp, Exception e) {
StringBuilder msg = new StringBuilder();
msg.append("<whatever makes sense>");
logger.error(msg.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
另请看一下这个相关的问题: -
AOP 通过将横切关注点分离(模块)到方面来实现有凝聚力的开发。简单来说,它只是一个拦截器来拦截一些进程,例如,当一个方法被执行时,Spring AOP可以劫持正在执行的方法,并在方法执行之前或之后添加额外的功能。
例如:日志记录、事务和安全是一些方面。在日志中,我们可能有不同的方面,即时间计算日志、简单的输入和输出消息日志等等。
注意:对于标记为 final 的方法,Spring 不支持 AOP。
AOP 的工作方式类似于面向对象编程。在面向对象编程中,模块化的单位是 Object 但在面向方面编程中,模块化的单位是Aspect。Aspect作为关注点的模块化工作,称为 AOP 中的横切关注点。AOP 框架在 spring 中是可插拔的。AOP 提供声明式企业服务并允许用户实现自定义方面。
Spring 提供了带有 AOP 的声明式编程。这是实现横切关注点的更好方法,而无需 在整个核心业务类中使用管道代码。AOP 使您能够考虑系统中的关注点或方面。典型的关注点是事务管理、日志记录等。AOP 使您能够捕获模块(例如拦截器)中的横切代码,这些模块可以在它们表达的关注点适用的任何地方以声明方式应用。Spring 包含一个基于代理的 AOP 框架。
| 归档时间: |
|
| 查看次数: |
7727 次 |
| 最近记录: |