我正在使用Spring3.0框架,还是个新手。有人能用外行术语给我解释一下什么是AOP编程吗?(一个简短的例子肯定会有帮助)
Spring如何合并/增强/支持它?
发布于 2011-04-08 09:08:24
AOP是一种修改代码库中现有类的方法,以便根据单独定义的规则来修饰它们或更改它们的行为。此修改可以在将类放入jar/war之前完成,也可以在加载代码时动态进行。
其思想是,不是在源代码中找到您想要修改的所有代码点并手动修改它们,而是定义如何在代码库中找到兴趣点的规则,以及您希望对它们进行哪些修饰。这些规则被称为方面(AOP中的A)。
典型的例子是你想要在你的代码库中获得一些关于各种方法的计时信息。您可以找到所有感兴趣的方法,并在顶部调用
long start = System.currentTimeMillis();在结束时
long end = System.currentTimeMillis();
System.out.println("Method time is: " + (end - start));但那就是:
搞得一团糟
相反,您可以定义方面来说明您想要修改哪些方法,以及您想要在这些方法的开头和结尾做些什么。
当应用AOP时,无论是在jar创建时,还是在类装入时,就好像您最初是以这种方式编写类一样。
发布于 2011-04-08 09:07:58
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>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());
}
}另请看这个相关的问题:
发布于 2016-10-05 20:28:36
面向方面编程是非常新的,它不是面向对象编程的替代品。事实上,AOP是组织程序结构的另一种方式。
为了更清楚,我将使用一些图表:
|---------------------|------------------|------------------| | Aspect =切点+建议||-|-|-|应用|执行的方面|代码是什么。| |---------------------|------------------|------------------|
Aspect = Point cut + Advice

@ trace(ProceedingJoinPointproceedingJP)throwsThrowable{ ( "execution(* *(..))“) public Object proceedingJP.getStaticPart().getSignature().toString();String methodInformation= logger.trace("Entering "+methodInformation);try{ returnproceedingJP.proceed();} catch(Throwable ex) { logger.error("Exception in "+methodInformation,ex);throw ex;}trace(ProceedingJoinPointproceedingJP)throwsThrowable{{ logger.trace("Exiting "+methodInformation);} }
https://stackoverflow.com/questions/5589319
复制相似问题