Java 理解springaop

Java 理解springaop,java,spring,aop,aspectj,Java,Spring,Aop,Aspectj,我正在使用Spring3.0框架,还是个新手。有人能用外行的术语解释一下什么是AOP编程吗?(举个简单的例子肯定会有帮助) Spring如何整合/增强/支持它?是一种用于模块化横切功能的模式。因此,如果有某个“东西”适用于代码中的重要部分,那么您可以使用AOP来解决该问题。这些“事物”称为方面 下面是一个例子: 在整个企业应用程序中使用异常记录器。因此,您可以通过以下方式使用AOP进行设置。因此,现在my.service包下的所有方法都将按以下方式记录 <bean id="except

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

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

是一种用于模块化横切功能的模式。因此,如果有某个“东西”适用于代码中的重要部分,那么您可以使用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>


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

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

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

long start = System.currentTimeMillis();
最后你要做什么

long end = System.currentTimeMillis();
System.out.println("Method time is: " + (end - start));
但这是:

  • 可能是一堆工作
  • 临时的,并且你不想弄乱你的代码库
  • 相反,您可以定义一些方面,说明您想要修改哪些方法,以及您想要在这些方法的开头和结尾做些什么


    当应用AOP时,无论是在jar创建时,还是在类加载时,就好像您最初是这样编写类的。

    简而言之,AOP是数学家解释如何整齐地组织代码,以避免特定功能分散在许多模块或对象中。从本质上讲,AOP是一件好事,不管它是否被称为AOP

    但是您面临着一个特定的AOP实现,需要弄清楚如何使用它。我认为最好的方法是寻找博客,人们在博客上发布食谱和他们如何使用Spring的例子。通过这种方式,你可以绕过数学学家,阅读更贴近现实的工程师的著作

    有两种计算机科学家,一种是喜欢晦涩难懂的数学家,他们用扭曲的术语解释简单的事情,另一种是工程师,他们会一步一步地告诉你如何构建软件。在职程序员更倾向于工程师思维,因为抽象思考者发现很难处理获得经验的漫长过程。这就是为什么你觉得AOP很难理解。不是因为它很难理解,而是因为抽象的数学思考者对它的解释太差,他们对“普通英语”并不十分熟悉


    我想知道如果AOP专家与功能点分析专家坐在一起会发生什么。

    AOP通过将横切关注点分离(模块)到方面来实现内聚开发。简单地说,它只是一个拦截器来拦截一些进程,例如,当一个方法被执行时,SpringAOP可以劫持执行的方法,并在方法执行之前或之后添加额外的功能

    例如:日志、事务和安全是一些方面。在日志记录方面,我们可能有不同的方面,即时间计算日志记录、简单的输入和输出消息日志记录等

    • 建议定义需要应用的内容
    • Joinpoint是应用建议的地方
    • 切入点是不同连接点的组合
    • 方面正在切入点应用建议
    注意:对于标记为final的方法,Spring不支持AOP


    AOP的工作原理类似于面向对象编程。在面向对象编程中,模块化的单位是对象,但在面向方面编程中,模块化的单位是方面方面是AOP中被称为横切关注点的关注点的模块化。AOP框架在spring中是可插入的。AOP提供声明性企业服务,并允许用户实现自定义方面


    Spring使用AOP提供声明式编程。这是实现横切关注点的更好方法,而无需在所有核心业务类中使用管道代码。AOP使您能够考虑系统中的问题或方面。典型的关注点是事务管理、日志记录等。AOP使您能够捕获模块(如拦截器)中的横切代码,这些模块可以声明性地应用于它们表示的关注点应用的任何地方。Spring包括一个基于代理的AOP框架


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

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

  • 什么是方面

    |---------------------|------------------|------------------|
    |      Aspect         =     Point cut    +  Advice          |
    |---------------------|------------------|------------------|
    |                     | Where the aspect | What code is     |
    |                     |  is applied      |  executed.       |
    |---------------------|------------------|------------------|
    
    方面=切入点+建议

  • 建议方法的类型

  • 方面示例

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

  • 看一看,它们真的非常棒(诚实!)我曾试图阅读文章、手册和论坛来理解AOP,但我对所有模糊的术语和使用的抽象语言感到困惑(我小小的大脑在试图处理术语时关闭了),我开始行动,at的第三版对使用Spring进行面向方面编程给出了极好的解释。我建议您按照本教程从理论到代码e进行学习
    @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);
        }
    }