AOP -连接点和切点的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AOP -连接点和切点的区别相关的知识,希望对你有一定的参考价值。

参考技术A public class Logging /**

    * This is the method which I would like to execute

    * before a selected method execution.

    */public void beforeAdvice()

        System.out.println("Going to setup student profile.");

   

    /**

    * This is the method which I would like to execute

    * after a selected method execution.

    */public void afterAdvice()

        System.out.println("Student profile has been setup.");



    /**

    * This is the method which I would like to execute

    * when any method returns.

    */

    public void afterReturningAdvice(Object retVal)

        System.out.println("Returning:" + retVal.toString());

   

    /**

    * This is the method which I would like to execute

    * if there is an exception raised.

    */

    public void AfterThrowingAdvice(IllegalArgumentException ex)

        System.out.println("There has been an exception: " + ex.toString());

   



-------这垃圾文本器太不友好

<bean id="student" class="com.seeyon.SpringBean.aop.Student" p:name="yangyu" p:age="27"></bean>

<bean id="logging" class="com.seeyon.SpringBean.aop.Logging"></bean>

<aop:config>

<aop:aspect id="log" ref="logging"> ------切面class

<aop:pointcut id="studentMethod" expression="execution(* com.seeyon.SpringBean.aop.Student.get*(..))"/> -------切点

<aop:before pointcut-ref="studentMethod" method="beforeAdvice"/>------方法执行之前触发切面class的beforeAdvice方法

<aop:after pointcut-ref="studentMethod" method="afterAdvice"/>------方法执行之后触发切面class的afterAdvice方法

</aop:aspect>

</aop:config>

切点:"execution(* com.seeyon.SpringBean.aop.Student.get*(..))"

(1)第一个*代表方法的返回值是任意的

(2)get*代表以get开头的所有方法

(3)(..)代表方法的参数是任意个数

public class test

    public static void main(String[] args)

        ApplicationContext context =

                new ClassPathXmlApplicationContext("SpringAop.xml");

        Student student = (Student) context.getBean("student");

        student.getName();

//        student.getAge();

//        student.printThrowException();

   



Going to setup student profile.

Name : yangyu

Student profile has been setup.

根据SpringAOP.xml配置

1.切点扫描到 getName()这个方法被调用时 这个连接点

2.在getName()被调用之前触发切面class的beforeAdvice方法,打印出(Going to setup student profile.)

3.执行getName()

4.方法执行之后触发切面class的afterAdvice方法打印(Student profile has been setup.)

Aspect(切面):上面xml中aop:aspect标签表示的就是一个切面;

Pointcut (切点):aop:pointcut标签表示一个切点,也就是满足条件被扫描到的目标方法;

Target Object(目标对象): 包含连接点的对象。也被称作被通知或被代理对象。(如上面所说的目标方法)

Join Point(连接点):连接点是一个虚拟的概念,可以理解为所有满足切点扫描条件的所有的时机。method="beforeAdvice"表示被扫描到目标方法后确定增强的时机,也就是连接点,这个表示前置一个增强(这里翻译Advice更好一点,而不是通知)

Advice(增强):增强是一个具体的函数,例如,日志记录,权限验证,事务控制,性能检测,错误信息检测等。

Introduction(引入): 添加方法或字段到被增强的类,Spring允许引入新的接口到任何被增强的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。Spring中要使用Introduction, 可有通过DelegatingIntroductionInterceptor来实现增强,通过DefaultIntroductionAdvisor来配置Advice和代理类要实现的接口

Weaving(织入):组装切面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。等候时机(连接点)

Spring 学习——Spring AOP——AOP配置篇Advice(无参数传递)

声明通知Advice

  • 配置方式(以前置通知为例子)
    • 方式一
      <aop:config>
      <aop:aspect id="ikAspectAop" ref="ikAspect">
      <aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..))"></aop:pointcut>
      <aop:before method="aspectBefore"
      pointcut-ref="ikPoint"></aop:before>
      </aop:aspect>
      </aop:config>
      • 优点:前置通知、后置通知、环绕通知使用同一个切点时,配置一个<aop:poincut />即可,方便配置。
    • 方式二
      <aop:config>
              <aop:aspect id="ikAspectAop" ref="ikAspect">
                      <aop:before method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..))"></aop:before>
              </aop:aspect>
      </aop:config>
      • 优点:前置通知、后置通知、环绕通知使用不同切点时,不需要配置<aop:poincut />元素,可以直接在<aop:before />元素内配置切点。
    • Next
       
  • 前置通知(Before Advice)
    • 在切入点时机事务执行之前,执行通知
    • 方式一
       <aop:config>
           <aop:aspect id="ikAspectAop" ref="ikAspect">
                <aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..))"></aop:pointcut>
                <aop:before method="aspectBefore" pointcut-ref="ikPoint"></aop:before>
           </aop:aspect>
       </aop:config>
    • 方式二
       <aop:config>
            <aop:aspect id="ikAspectAop" ref="ikAspect">
                 <aop:before method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..))"></aop:before>
            </aop:aspect>
       </aop:config>
    • Next
  • 后置通知(After Running Advice)
    • 在切入点时机事务执行之后,执行通知(前提:切入点执行时没有异常,否则不会执行
    • 方式一
      <aop:config>
           <aop:aspect id="ikAspectAop" ref="ikAspect">
                <aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..))"></aop:pointcut>
                <aop:after-returning method="aspectBefore" pointcut-ref="ikPoint"></aop:before>
           </aop:aspect>
       </aop:config>
    • 方式二
      <aop:config>
           <aop:aspect id="ikAspectAop" ref="ikAspect">
                <aop:after-returning method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..))"></aop:before>
           </aop:aspect>
       </aop:config>
    • Next
  • 抛出异常通知(After Throwing Advice)
    • 若在切入点时机执行时抛出异常,执行通知。(执行异常通知,则不会执行后置通知
    • 方式一
      <aop:config>
           <aop:aspect id="ikAspectAop" ref="ikAspect">
                <aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..))"></aop:pointcut>
                <aop:after-throwing method="aspectBefore" pointcut-ref="ikPoint"></aop:before>
           </aop:aspect>
       </aop:config>
    • 方式二
      <aop:config>
           <aop:aspect id="ikAspectAop" ref="ikAspect">
                <aop:after-throwing method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..))"></aop:before>
           </aop:aspect>
       </aop:config>
    • Next
  • 后通知(After Ending Advice)
    • 在切入点时机执行之后,执行通知。(切入点执行时,无论正常执行,还是抛出异常,都会执行通知,相当于try_catch_finally)。
    • 方式一
      <aop:config>
           <aop:aspect id="ikAspectAop" ref="ikAspect">
                <aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..))"></aop:pointcut>
                <aop:after method="aspectBefore" pointcut-ref="ikPoint"></aop:before>
           </aop:aspect>
       </aop:config>
    • 方式二
      <aop:config>
           <aop:aspect id="ikAspectAop" ref="ikAspect">
                <aop:after method="aspectBefore" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..))"></aop:before>
           </aop:aspect>
       </aop:config>
    • Next
    • 无论切面是否出现异常,后通知动作正常执行
  • 环绕通知(Around Advice)
    • 环绕通知在
    • 方式一
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop.xsd" >

      <bean id="ikAspect" class="com.jing.spring.aop.IKAspect"></bean>
      <bean id="ikAspectBiz" class="com.jing.spring.aop.IKAspectBiz"></bean>

      <aop:config>
      <aop:aspect id="ikAspectAop" ref="ikAspect">
      <aop:pointcut id="ikPoint" expression="execution(* com.jing.spring.aop.IKAspectBiz.*(..))"></aop:pointcut>
      <aop:around method="aspectAround" pointcut-ref="ikPoint"></aop:around>
      </aop:aspect>
      </aop:config>

      </beans>
      package com.jing.spring.aop;
      import org.aspectj.lang.ProceedingJoinPoint;
      
      public class IKAspect {
      public void aspectAround(ProceedingJoinPoint pj){
      
              System.out.println("IKAspect.aspectAroud,its 环绕通知前");
              try {
                  Object proceed = pj.proceed();
              } catch (Throwable throwable) {
                  throwable.printStackTrace();
              }
              System.out.println("IKAspect.aspectAroud,its 环绕通知后");
      
          }
      }
    • 方式二
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:context="http://www.springframework.org/schema/context"
             xmlns:aop="http://www.springframework.org/schema/aop"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
              http://www.springframework.org/schema/beans/spring-beans.xsd
              http://www.springframework.org/schema/context
              http://www.springframework.org/schema/context/spring-context.xsd
              http://www.springframework.org/schema/aop
              http://www.springframework.org/schema/aop/spring-aop.xsd" >
      
              <bean id="ikAspect" class="com.jing.spring.aop.IKAspect"></bean>
              <bean id="ikAspectBiz" class="com.jing.spring.aop.IKAspectBiz"></bean>
      
              <aop:config>
                  <aop:aspect id="ikAspectAop" ref="ikAspect">
                      <aop:around method="aspectAround" pointcut="execution(* com.jing.spring.aop.IKAspectBiz.*(..))"></aop:around>
                  </aop:aspect>
              </aop:config>
      
      </beans>
      package com.jing.spring.aop;
      import org.aspectj.lang.ProceedingJoinPoint;
      
      public class IKAspect {
      public void aspectAround(ProceedingJoinPoint pj){
      
              System.out.println("IKAspect.aspectAroud,its 环绕通知前");
              try {
                  Object proceed = pj.proceed();
              } catch (Throwable throwable) {
                  throwable.printStackTrace();
              }
              System.out.println("IKAspect.aspectAroud,its 环绕通知后");
      
          }
      }
    • Next

 

以上是关于AOP -连接点和切点的区别的主要内容,如果未能解决你的问题,请参考以下文章

Spring读源码系列之AOP--01---aop基本概念扫盲---上

Spring AOP(基于代理类的AOP实现)

spring相关—AOP编程—数学计算器情景示例讲解(包含注解配置AOP与XML配置AOP)

Spring AOP 在XML中声明切面

Spring框架 AOP

aop日志管理(摘)