接口类:
- package com.spring.aop.xml;
- 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);
- }
实现类:
切面类:
- package com.spring.aop.xml;
- 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;
- }
- }
- package com.spring.aop.xml;
- import java.util.Arrays;
- import org.aspectj.lang.JoinPoint;
- public class VlidationAspect {
- public void validateArgs(JoinPoint joinPoint){
- System.out.println("-->validate:" + Arrays.asList(joinPoint.getArgs()));
- }
- }
切面类2:
- package com.spring.aop.xml;
- import java.util.Arrays;
- import org.aspectj.lang.JoinPoint;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.Around;
- public class LoggingAspect {
- 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));
- }
- public void afterMethod(JoinPoint joinPoint){
- String methodName = joinPoint.getSignature().getName();
- System.out.println("The method " + methodName + " ends");
- }
- public void afterReturning(JoinPoint joinPoint,Object result){
- String methodName = joinPoint.getSignature().getName();
- System.out.println("The method " + methodName + " ends with " + result);
- }
- public void afterThrowing(JoinPoint joinPoint,Exception e){
- String methodName = joinPoint.getSignature().getName();
- System.out.println("The method " + methodName + " occurs excetion:" + e);
- }
- @Around("execution(public int com.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;
- }
- }
测试类:
- package com.spring.aop.xml;
- 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.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,0);
- System.out.println("result:" + result);
- }
- }
配置文件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-4.0.xsd">
- <!-- 配置 bean -->
- <bean id="arithmeticCalculator"
- class="comspring.aop.xml.ArithmeticCalculatorImpl"></bean>
- <!-- 配置切面的 bean. -->
- <bean id="loggingAspect"
- class="com.spring.aop.xml.LoggingAspect"></bean>
- <bean id="vlidationAspect"
- class="com.spring.aop.xml.VlidationAspect"></bean>
- <!-- 配置 AOP -->
- <aop:config>
- <!-- 配置切点表达式 -->
- <aop:pointcut expression="execution(* com.spring.aop.xml.ArithmeticCalculator.*(int,int))"
- id="pointcut"/>
- <!-- 配置切面及通知 -->
- <aop:aspect ref="loggingAspect" order="2">
- <aop:before method="beforeMethod" pointcut-ref="pointcut"/>
- <aop:after method="afterMethod" pointcut-ref="pointcut"/>
- <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut" throwing="e"/>
- <aop:after-returning method="afterReturning" pointcut-ref="pointcut" returning="result"/>
- <!--
- <aop:around method="aroundMethod" pointcut-ref="pointcut"/>
- -->
- </aop:aspect>
- <aop:aspect ref="vlidationAspect" order="1">
- <aop:before method="validateArgs" pointcut-ref="pointcut"/>
- </aop:aspect>
- </aop:config>
- </beans>