zoukankan      html  css  js  c++  java
  • SpringMVC 的 切面

    官网路径:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans

    一:术语介绍

    通知(Advice)

    指切面(定义为aspect的类)中的工作;

    spring切面可以应用的五种通知:

    前置通知(Before):在目标方法被调用之前调用通知功能;

    后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;

    返回通知(After-returning):在目标方法成功执行之后调用通知;

    异常通知(After-throwing):在目标方法抛出异常后调用通知;

    环绕通知(Around):通知报过了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

    连接点(Join point)

    连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时,抛出异常时,甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。(切点方法中配置的匹配的方法都是连接点)

    切点(Pointcut)

    定义通知所要织入的一个或多个连接点。

    切面(Aspect)

    是通知和切点的结合。

    引入(Introduction)

    向现有的类添加新的方法和属性。

    织入(Weaving)

    织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入:

    编译期:切面在目标类编译时被织入,这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。

    类加载期:切面在目标类加载到jvm时被织入。这种方式 需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5的加载时织入(load-time weaving,LTW)就支持以这种方式织入切面。

    运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态的创建一个代理对象。Spring AOP就是以这种方式织入切面的。

    下图展示了这些概念是如何联系在一起的。

    下面了解一下具体的切点表达式。在spring的切面中,主要使用execution指示器来设置匹配的方法。下图中的表达式能够设置当sleep()方法执行时触发的通知调用。
    execution()指示器选择ViewController的sleep()方法,方法表达式以“*”号开始,表明了不关心方法返回值的类型。然后,指定了全限定方法名和类名。对于方法参数列表,使用两个点号(. .)表明切点要选择任意的sleep()方法,不需要考虑入参。


    使用AspectJ切点表达式来选择ViewController的sleep方法


    如果我们需要设定切点仅适用于某个包下的方法,则可以使用within()指示器来指定,不同的指示器之间使用&&(and)或||(or)连接。如下图表达式,表示只匹配com.spring包下的ViewController的sleep()方法。

    spring中还引入了bean()指示器,可以限制切点只匹配特定的bean,也可以使用!bean()来匹配除了特定bean以外的其他bean。如下:
    execution(*  com.spring.ViewController.sleep())   and  bean ("rest")

    execution(*  com.spring.ViewController.sleep())   and  !bean ("rest")

    下面写一个切面的demo。

    首先,在com.spring下的ViewController类中添加一个sleep()方法如下:

    @RequestMapping("/sleep")
    public String sleep(){
        System.out.println("sleeping………………zzzZZZ~~~~");
        return "index";
    }


    然后,添加切面代码。使用注解新建一个切面SleepHelper,代码如下。

    @Component
    @Aspect
    public class SleepHelper {
    
    public SleepHelper(){
    
    }
    
    @Pointcut("execution(* com.spring.controller.ViewController.*(..))")
    public void sleeppoint(){
    }
    
    @Before("sleeppoint()")
    public void beforeSleep(){
     System.out.println("马上要睡觉咯~~~");
    }
    
    @AfterReturning("sleeppoint()")
    public void afterSleep(){
    
    System.out.println("睡醒咯!");
    }
    
    }
    

     当然也可以这么定义

    @Before("execution(* com.spring.controller.ViewController.save(..)) && args(para1,para1)")
    public void test(String para1,String para1) throws Exception {
        params= obj;
    }
    

    关于参数:

    com.spring.controller.ViewController.save(..)
    此处为切入到具体方法:
    save(..)  -- .. 表示所有参数
    args(para1,para1) 此处为具体参数
    public void test(String para1,String para1) --方法里面的可以拿出来在方法中使用

    最后,项目是maven的项目,所以需要在pom.xml中添加切面对应的依赖jar包,并在applicationContext.xml文件中添加下图红框中的内容:


    第一个红框中内容作用:声明spring的aop的命名空间;
    第二个红框中内容作用:启用aspectj的自动代理;

  • 相关阅读:
    R
    R 包的安装,使用,更新
    R 安装 简单实用
    R 介绍
    mongo:用户管理
    MySQL 书籍
    mongo: 索引
    blog
    游标处理
    如何在ASP.NET的web.config配置文件中添加MIME类型
  • 原文地址:https://www.cnblogs.com/songsong003/p/10682500.html
Copyright © 2011-2022 走看看