zoukankan      html  css  js  c++  java
  • Spring AOP(5)-- 注解

    applicationContext.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:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    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-4.0.xsd">

    <!-- 配置自动扫描的包 -->
    <context:component-scan base-package="com.atguigu.spring.aop"></context:component-scan>

    <!-- 配置自动为匹配 aspectJ 注解的 Java 类生成代理对象 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

    </beans>

    ArithmeticCalculator.java

    package com.atguigu.spring.aop;

    public interface ArithmeticCalculator {

    int add(int i, int j);
    int sub(int i, int j);

    int mul(int i, int j);
    int div(int i, int j);

    }

    ArithmeticCalculatorImpl.java

    package com.atguigu.spring.aop;

    import org.springframework.stereotype.Component;

    @Component("arithmeticCalculator")
    public class ArithmeticCalculatorImpl implements ArithmeticCalculator {

    @Override
    public int add(int i, int j) {
    int result = i + j;
    return result;
    }

    @Override
    public int sub(int i, int j) {
    int result = i - j;
    return result;
    }

    @Override
    public int mul(int i, int j) {
    int result = i * j;
    return result;
    }

    @Override
    public int div(int i, int j) {
    int result = i / j;
    return result;
    }

    }

    LoggingAspect.java

    package com.atguigu.spring.aop;

    import java.util.Arrays;

    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;

    /**
    * 可以使用 @Order 注解指定切面的优先级, 值越小优先级越高
    */
    @Order(2)
    @Aspect
    @Component
    public class LoggingAspect {

    /**
    * 定义一个方法, 用于声明切入点表达式. 一般地, 该方法中再不需要添入其他的代码.
    * 使用 @Pointcut 来声明切入点表达式.
    * 后面的其他通知直接使用方法名来引用当前的切入点表达式.
    */
    @Pointcut("execution(public int com.atguigu.spring.aop.ArithmeticCalculator.*(..))")
    public void declareJointPointExpression(){}

    /**
    * 在 com.atguigu.spring.aop.ArithmeticCalculator 接口的每一个实现类的每一个方法开始之前执行一段代码
    */
    @Before("declareJointPointExpression()")
    public void beforeMethod(JoinPoint joinPoint){
    String methodName = joinPoint.getSignature().getName();
    Object [] args = joinPoint.getArgs();

    System.out.println("The method " + methodName + " begins with " + Arrays.asList(args));
    }

    /**
    * 在方法执行之后执行的代码. 无论该方法是否出现异常
    */
    @After("declareJointPointExpression()")
    public void afterMethod(JoinPoint joinPoint){
    String methodName = joinPoint.getSignature().getName();
    System.out.println("The method " + methodName + " ends");
    }

    /**
    * 在方法法正常结束受执行的代码
    * 返回通知是可以访问到方法的返回值的!
    */
    @AfterReturning(value="declareJointPointExpression()",
    returning="result")
    public void afterReturning(JoinPoint joinPoint, Object result){
    String methodName = joinPoint.getSignature().getName();
    System.out.println("The method " + methodName + " ends with " + result);
    }

    /**
    * 在目标方法出现异常时会执行的代码.
    * 可以访问到异常对象; 且可以指定在出现特定异常时在执行通知代码
    */
    @AfterThrowing(value="declareJointPointExpression()",
    throwing="e")
    public void afterThrowing(JoinPoint joinPoint, Exception e){
    String methodName = joinPoint.getSignature().getName();
    System.out.println("The method " + methodName + " occurs excetion:" + e);
    }

    /**
    * 环绕通知需要携带 ProceedingJoinPoint 类型的参数.
    * 环绕通知类似于动态代理的全过程: ProceedingJoinPoint 类型的参数可以决定是否执行目标方法.
    * 且环绕通知必须有返回值, 返回值即为目标方法的返回值
    */
    /*
    @Around("execution(public int com.atguigu.spring.aop.ArithmeticCalculator.*(..))")
    public Object aroundMethod(ProceedingJoinPoint pjd){

    Object result = null;
    String methodName = pjd.getSignature().getName();

    try {
    //前置通知
    System.out.println("The method " + methodName + " begins with " + Arrays.asList(pjd.getArgs()));
    //执行目标方法
    result = pjd.proceed();
    //返回通知
    System.out.println("The method " + methodName + " ends with " + result);
    } catch (Throwable e) {
    //异常通知
    System.out.println("The method " + methodName + " occurs exception:" + e);
    throw new RuntimeException(e);
    }
    //后置通知
    System.out.println("The method " + methodName + " ends");

    return result;
    }
    */
    }

    VlidationAspect.java

    package com.atguigu.spring.aop;

    import java.util.Arrays;

    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;

    @Order(1)
    @Aspect
    @Component
    public class VlidationAspect {

    @Before("com.atguigu.spring.aop.LoggingAspect.declareJointPointExpression()")
    public void validateArgs(JoinPoint joinPoint){
    System.out.println("-->validate:" + Arrays.asList(joinPoint.getArgs()));
    }

    }

    Main.java

    package com.atguigu.spring.aop;

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    public class Main {

    public static void main(String[] args) {

    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    ArithmeticCalculator arithmeticCalculator = (ArithmeticCalculator) ctx.getBean("arithmeticCalculator");

    System.out.println(arithmeticCalculator.getClass().getName());

    int result = arithmeticCalculator.add(1, 2);
    System.out.println("result:" + result);

    result = arithmeticCalculator.div(1000, 10);
    System.out.println("result:" + result);
    }

    }

  • 相关阅读:
    java面试-synchronized底层实现机制
    java面试-内存分配与回收策略
    java面试-对象的创建、内存布局、访问定位
    推荐算法-余弦相似度
    推荐算法-欧几里得距离
    MySQL总结
    MySQL事务
    MySQL-一条sql语句的执行顺序
    mysql 表格操作指令大全(Show、desc、create、insert into、delete、select、drop、update、alter)
    mysql 创建数据数据库 (避免新建的库名已经存在、设置编码)
  • 原文地址:https://www.cnblogs.com/yang-hao/p/5821822.html
Copyright © 2011-2022 走看看