Spring的AOP简单使用

强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan

相关概念

1.连接点(Joinpoint):类里面哪些方法可以被增强,这些方法称为连接点
2.切入点:在类里可以有很多的方法被增强,实际增强的方法称为切入点
3.通知/增强:增强的逻辑,称为增强

  • 前置通知:在方法之前执行
  • 后置通知:在方法之后执行
  • 异常通知:方法出现异常
  • 最终通知:在后置之后执行
  • 环绕通知:在方法之前和之后执行

4.切面(Aspect):增强具体方法的过程称为切面(把增强用到切入点的过程)

表达式配置切入点

  1. execution(<访问修饰符>?<返回类型><方法名>(<参数><异常>)
    以上表达式中的访问修饰符和返回类型,方法名都可使用*表示,其中需要注意的地方是访问修饰符和返回类型之间必须有一个空格。
execution(* zh.spring.aop.Book.*(..))

AOP原理

在原有方法上增强,底层使用jdk动态代理和cglib动态代理。使原有方法不需要改变,一样可以达到横向的扩展,使用jdk动态代理,是针对有接口的情况,创建接口实现类代理对象,使用cglib动态代理是针对没有接口的情况,创建被增强类的子类代理对象,在子类里调用父类的方法完成增强。具体实现另写一篇博客记录。

AOP的使用

使用aop需要依赖aop的jar包,其中包括:
  • spring-aop
  • aopalliance
  • aspectjweaver
  • spring-aspects

建立被增强的类Book:

public class Book {
    public void add(){
        System.out.println("add......");
    }
}

建立aop增强类MyBook:

public class MyBook {
    public void before1(){
        System.out.println("前置增强...");
    }

    public void after1(){
        System.out.println("后置增强...");
    }

    public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        //方法之前
        System.out.println("方法之前...");

        //执行被增强的方法
        proceedingJoinPoint.proceed();

        //方法之后
        System.out.println("方法之后...");
    }
}

在resource下创建spring-aop.xml配置文件,分别配置前置,后置和环绕通知:

<?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: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/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--1. 配置对象-->
    <bean id="book" class="zh.spring.aop.Book"></bean>
    <bean id="myBook" class="zh.spring.aop.MyBook"></bean>

    <!--2. 配置aop操作-->
    <aop:config>
        <!--2.1 配置切入点-->
        <aop:pointcut id="pointcut1" expression="execution(* zh.spring.aop.Book.*(..))"/>
        <!--2.2 配置切面-->
        <aop:aspect ref="myBook">
            <!--配置增强类型 method:增强类里使用哪个方法作为前置-->
            <aop:before method="before1" pointcut-ref="pointcut1"/>
            <!--后置增强-->
            <aop:after-returning method="after1" pointcut-ref="pointcut1"/>
            <!--环绕通知-->
            <aop:around method="around1" pointcut-ref="pointcut1"/>
        </aop:aspect>
    </aop:config>
</beans>

写测试类,测试结果:

public class TestAOP {
    @Test
    public void testAop(){
        //加载spring配置文件,创建对象
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-aop.xml");
        //得到配置创建的对象
        Book book =(Book)context.getBean("book");
        book.add();
    }
}

执行结果如下:

前置增强...
方法之前...
add......
方法之后...
后置增强...

四个处理器的优先级

四个处理器的优先等级如下(从低到高),最高优先等级的最后织入:
Before-->Around-->AfterReturning-->After
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页