本文主要是sPRing的除ioc以外的另外一个特色aop的使用方式
本篇配置是基于注解的
配置文件aop.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd"> <context:component-scan base-package="com.liu.aop" /> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>ICalculator.java
package com.liu.aop;public interface ICalculator { public int add(int i,int j); public int minus(int i,int j); public int div(int i,int j);}Calculator.java
package com.liu.aop;import org.springframework.stereotype.Component;@Componentpublic class Calculator implements ICalculator { @Override public int add(int i, int j) { return i + j; } @Override public int minus(int i, int j) { return i - j; } @Override public int div(int i, int j) { return i/j; }}CalculatorAspect.java
package com.liu.aop;import java.util.Arrays;import java.util.List;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Around;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(2)//切面声明@Aspect@Componentpublic class CalculatorAspect { //切入点表达式 @Pointcut(value="execution(public int com.liu.aop.ICalculator.add(.. ))") public void declareAddMethod(){} //前置通知 @Before(value="declareAddMethod()") public void beforeMethod(JoinPoint joinPoint){ String methodName = joinPoint.getSignature().getName(); List<Object> args = Arrays.asList(joinPoint.getArgs()); System.out.println("The method "+ methodName+ " begin with"+args); } //后置通知 @After(value="declareAddMethod()") public void afterMethod(JoinPoint joinPoint){ String methodName = joinPoint.getSignature().getName(); System.out.println("The method "+ methodName+ " end "); } //返回通知 @AfterReturning(value="declareAddMethod()",returning="result") public void afterReturn(JoinPoint joinPoint,Object result){ String methodName = joinPoint.getSignature().getName(); System.out.println("The method "+ methodName+ " return with " + result); } //异常通知 @AfterThrowing(value="execution(public int com.liu.aop.ICalculator.div(.. ))",throwing="e") public void afterThrow(JoinPoint joinPoint,Exception e){ String methodName = joinPoint.getSignature().getName(); System.out.println("The method "+ methodName+ " occurs with " + e); } //环绕通知 @Around(value="execution(public int com.liu.aop.ICalculator.minus(.. ))") public Object aroundMethod(ProceedingJoinPoint pjoinPoint){ Object result = null; String methodName = pjoinPoint.getSignature().getName(); List<Object> args = Arrays.asList(pjoinPoint.getArgs()); System.out.println("The method "+ methodName+ " begin with"+args); try { result = pjoinPoint.proceed(); } catch (Throwable e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("The method "+ methodName+ " return with "+result); return result; }}ValidateAspect.java
package com.liu.aop;import java.util.Arrays;import java.util.List;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@Componentpublic class ValidateAspect { //前置通知 @Before(value="CalculatorAspect.declareAddMethod()") public void beforeMethod(JoinPoint joinPoint){ System.out.println("The method validate"); }}Test.java
package com.liu.aop;import org.springframework.context.applicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test { public static void main(String[] args) { ApplicationContext cxt = new ClassPathXmlApplicationContext("aop.xml"); ICalculator calculator = (ICalculator)cxt.getBean("calculator"); calculator.add(1, 3); calculator.minus(1, 3); calculator.div(1, 0); }}
新闻热点
疑难解答