首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解Spring AOP

理解Spring AOP
EN

Stack Overflow用户
提问于 2011-04-08 08:58:46
回答 5查看 9.3K关注 0票数 12

我正在使用Spring3.0框架,还是个新手。有人能用外行术语给我解释一下什么是AOP编程吗?(一个简短的例子肯定会有帮助)

Spring如何合并/增强/支持它?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-08 09:08:24

AOP是一种修改代码库中现有类的方法,以便根据单独定义的规则来修饰它们或更改它们的行为。此修改可以在将类放入jar/war之前完成,也可以在加载代码时动态进行。

其思想是,不是在源代码中找到您想要修改的所有代码点并手动修改它们,而是定义如何在代码库中找到兴趣点的规则,以及您希望对它们进行哪些修饰。这些规则被称为方面(AOP中的A)。

典型的例子是你想要在你的代码库中获得一些关于各种方法的计时信息。您可以找到所有感兴趣的方法,并在顶部调用

代码语言:javascript
复制
long start = System.currentTimeMillis();

在结束时

代码语言:javascript
复制
long end = System.currentTimeMillis();
System.out.println("Method time is: " + (end - start));

但那就是:

  1. 可能是一堆
  2. 临时的工作,你不会想把你的代码库

搞得一团糟

相反,您可以定义方面来说明您想要修改哪些方法,以及您想要在这些方法的开头和结尾做些什么。

当应用AOP时,无论是在jar创建时,还是在类装入时,就好像您最初是以这种方式编写类一样。

票数 30
EN

Stack Overflow用户

发布于 2011-04-08 09:07:58

AOP是一种用于模块化横切特征的模式。因此,如果有某个“东西”适用于代码中的重要部分,那么您可以使用AOP来解决这个问题。这些“东西”被称为“方面”。

下面是一个示例:

异常记录器在整个企业应用程序中使用。因此,您可以通过以下方式使用AOP来设置它。因此,现在my.service包下的所有方法都将以以下方式记录。

代码语言:javascript
复制
  <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类可能如下所示:

代码语言:javascript
复制
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());
    }
}

另请看这个相关的问题:

  1. What is the most common use for AOP in spring project
票数 7
EN

Stack Overflow用户

发布于 2016-10-05 20:28:36

面向方面编程是非常新的,它不是面向对象编程的替代品。事实上,AOP是组织程序结构的另一种方式。

为了更清楚,我将使用一些图表:

  1. 什么是Aspect?

|---------------------|------------------|------------------| | Aspect =切点+建议||-|-|-|应用|执行的方面|代码是什么。| |---------------------|------------------|------------------|

Aspect = Point cut + Advice

  • Type of Advice

  1. 方面示例

@ 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);} }

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5589319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档