美文网首页
spring aop 通知

spring aop 通知

作者: 七宝qb | 来源:发表于2017-04-08 17:51 被阅读167次

Spring aop

  1. 导入Spring aop基本jar包,使用的aspectj
  2. 配置文件引入命名空间,配置aop
  3. 把横切关注点的代码抽象到切面类中
    ①切面类是IOC容器的bean so加入 @Compnent 还要加入@Aspect
    ②在方法中声明通知 通知可写入表达式,
    ③可在方法中声明类型为JoinPoint的参数,然后就可以访问连接细节,如方法名和参数值。
aopAspect通知类型.png
AspectJ切入点表达式.png

通知代码

@Order(1)  // 通过此注解来调整优先级,数越小,优先级越高
@Component
@Aspect
public class Notice {

    //该方法声明一个前置通知,在方法开始之前执行
    @Before("execution(public int com.springTest.Proxy.ICalculation.div(int,int))")
    public void sayHelloBeforeMethod(JoinPoint joinPoint) {
        System.out.println("Before " + joinPoint.getSignature().getName());
    }

    //后置通知:在目标方法执行后(无论是否发生异常),执行的通知。
    //是在连接点完成之后执行的,即连接点返回结果或抛出 异常的时候,后置通知记录了方法的终止
    //在后置通知中还不能访问目标方法执行的结果
    @After("execution(public int com.springTest.Proxy.ICalculation.div(int,int))")
    public void sayByeAfterMetnod(JoinPoint joinPoint) {
        System.out.println("After " + joinPoint.getSignature().getName());
    }

    //方法正常结束受执行的代码
    //返回通知是可以访问到返回值的
    @AfterReturning(value = "execution(public int com.springTest.Proxy.ICalculation.div(int,int))", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        System.out.println("AfterReturning :" + joinPoint.getSignature().getName() + ",result is" + result);
    }

    //异常通知
    //可以访问异常对象
    //Exception处可以指定异常的类型,只有出相应异常的时候才会出发方法
    @AfterThrowing(value = "execution(public int com.springTest.Proxy.ICalculation.div(int,int))", throwing = "e")
    public void afterThrowing(JoinPoint joinPoint, Exception e) {
        String name = joinPoint.getSignature().getName();
        System.out.println("AfterThrowing :" + name + ", Exception :" + e);

    }

    /**
     * 环绕通知需要携带ProceedingJoinPoint 类型的参数
     * 类似动态代理,ProceedingJoinPoint 类型的参数可以决定是否执行目标方法。
     * 环绕通知必须有返回值,返回值即目标方法的返回值
     */
    @Around(value = "execution(public int com.springTest.Proxy.ICalculation.div(int,int))")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) {
        Object result = null;
        try {
            System.out.println("around 前置通知..."); 
            result = proceedingJoinPoint.proceed();
            System.out.println("around 返回通知... :" + result);

        } catch (Throwable throwable) {
            System.out.println("around 异常 :" + throwable);
//            throw new RuntimeException(throwable);
        }
        System.out.println("around 后置通知...");
        return result;
    }

}

通过配置文件的方式配置aop

 <!--配置 基本 bean-->
    <bean id="calculation" class="com.springTest.aop.withXml.Calculation"></bean>
    <bean id="notice" class="com.springTest.aop.withXml.Notice"></bean>
    <!--aop 配置-->
    <aop:config>
        <!--配置切点及表达式-->
        <aop:pointcut id="pointcut" expression="execution(* com.springTest.aop.withXml.ICalculation.*(int,int))"></aop:pointcut>
        <aop:aspect ref="notice" order="2">
            <aop:before method="sayHelloBeforeMethod" pointcut-ref="pointcut"></aop:before>
        </aop:aspect>
    </aop:config>

相关文章

  • 03 AOP学习之五种通知

    Spring AOP五种通知详解 spring aop通知(advice)分成五类: 前置通知Before adv...

  • Spring AOP 代理

    Spring AOP 代理 1. Spring AOP 增强类型 AOP 联盟为通知 Advice 定义了 org...

  • [java][SpringAOP]

    为什么会有AOP 实现AOP原理 AOP通知类型 AOP在Spring中配置

  • Spring AOP五种通知及其执行顺序

    spring aop通知(advice)分成五类:Spring-AOP的5种通知 - 不违本心 - 博客园 前置通...

  • 深入分析大厂面试题四

    1 Spring高级部分 1.1 spring的aop顺序 你肯定知道spring,那说说aop的全部通知顺序 s...

  • JDK动态代理实现自己的事务管理器

    spring aop介绍 spring提供了五种通知类型 Interception AroundJointPoin...

  • 第五章 spring aop

    5.1 AOP概念 spring aop核心概念图 通知 定义:在特定连接点执行的代码就是通知。内容:通知定义了切...

  • spring aop 通知

    Spring aop 导入Spring aop基本jar包,使用的aspectj 配置文件引入命名空间,配置a...

  • 基于Schema的AOP

    基于Schema的AOP从Spring2.0之后通过“aop”命名空间来定义切面、切入点及声明通知。在Spring...

  • SpringAOP实现源码解读

    1、Spring AOP样例 简单介绍怎么样基于Spring实现AOP编程(注解方式在目标对象方法中织入通知方法)...

网友评论

      本文标题:spring aop 通知

      本文链接:https://www.haomeiwen.com/subject/rrwlattx.html