Spring AOP(5)-- 注解

本文内容纲要:Spring AOP(5)-- 注解

applicationContext.xml

<context:component-scan base-package="com.atguigu.spring.aop"></context:component-scan>

aop:aspectj-autoproxy</aop:aspectj-autoproxy>

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);

}

}

本文内容总结:Spring AOP(5)-- 注解

原文链接:https://www.cnblogs.com/yang-hao/p/5821822.html

以上是 Spring AOP(5)-- 注解 的全部内容, 来源链接: utcz.com/z/296942.html

回到顶部