标签:signature 访问 cep time getbean schema 示例 ann 否则
通过表达式的方式定位一个或多个具体的连接点。
execution([权限修饰符] [返回值类型] [简单类名/全类名] [方法名]([参数列表])) |
表达式 |
execution(* com.atguigu.spring.ArithmeticCalculator.*(..)) |
含义 |
ArithmeticCalculator接口中声明的所有方法。 第一个“*”代表任意修饰符及任意返回值。 第二个“*”代表任意方法。 “..”匹配任意数量、任意类型的参数。 若目标类、接口与该切面类在同一个包中可以省略包名。 |
表达式 |
execution(public * ArithmeticCalculator.*(..)) |
含义 |
ArithmeticCalculator接口的所有公有方法 |
表达式 |
execution(public double ArithmeticCalculator.*(..)) |
含义 |
ArithmeticCalculator接口中返回double类型数值的方法 |
表达式 |
execution(public double ArithmeticCalculator.*(double, ..)) |
含义 |
第一个参数为double类型的方法。 “..” 匹配任意数量、任意类型的参数。 |
表达式 |
execution(public double ArithmeticCalculator.*(double, double)) |
含义 |
参数类型为double,double类型的方法 |
表达式 |
execution (* *.add(int,..)) || execution(* *.sub(int,..)) |
含义 |
任意类中第一个参数为int类型的add方法或sub方法 |
写一个类实现加减乘除,并生成 前置通知、后置通知、返回通知、异常通知 或环绕通知
创建文件时勾选aop bean context三个选项
<?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/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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"> <!-- 配置扫描的包 --> <context:component-scan base-package="com.tyd.spring.aop"></context:component-scan> <!-- 使用aop要创建此标签 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>
package com.tyd.spring.aop; public interface Math { public void add(int a,int b); public void sub(int a,int b); public void mul(int a,int b); public void div(int a,int b); public void add(int a, int b,int c); }
package com.tyd.spring.aop; import org.springframework.stereotype.Component; @Component public class MyEpressionMath implements Math{ @Override public void add(int a, int b) { int num=a+b; System.out.println(a+"+"+b+"="+num); } @Override public void sub(int a, int b) { System.out.println(a+"-"+b+"="+(a-b)); } @Override public void mul(int a, int b) { System.out.println(a+"*"+b+"="+(a*b)); } @Override public void div(int a, int b) { System.out.println(a+"/"+b+"="+(a/b)); } @Override public void add(int a, int b, int c) { System.out.println(a+"+"+b+c+"="+(a+b+c)); } }
package com.tyd.spring.aop; 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.springframework.stereotype.Component; @Component @Aspect //表明是切面类 public class CaculatorAspect { //value值为方法的全类名以及方法名:public void(访问权限及返回值类型)com.tyd.spring.aop.MyEpressionMath(全类名).*代表此类中所有方法(..)代表所有参数类型 @Before(value="execution(public void com.tyd.spring.aop.MyEpressionMath.*(..))") public void showBegin(){ System.out.println("【日志】【方法开始】"); } @AfterReturning(value="execution(public void com.tyd.spring.aop.MyEpressionMath.*(..))",returning="result") public void showAfter(){ System.out.println("【日志】【方法正常结束】"); } @AfterThrowing(value="execution(public void com.tyd.spring.aop.MyEpressionMath.*(..))") public void showexception(){ System.out.println("【日志】【方法出异常】"); } @After(value="execution(public void com.tyd.spring.aop.MyEpressionMath.*(..))") public void showAfterRe(){ System.out.println("【日志】【方法执行结束】"); } }
package com.tyd.spring.aop; import java.util.Arrays; import java.util.List; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; 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.springframework.stereotype.Component; @Component @Aspect //表明是切面类 public class CaculatorAspect { @Around(value="execution(public void com.tyd.spring.aop.MyEpressionMath.*(..))") public Object around(ProceedingJoinPoint joinPoint){ //获取目标方法参数 Object[] args = joinPoint.getArgs(); System.out.println("args:"+args); //获取签名 Signature signature = joinPoint.getSignature(); System.out.println("signature:"+signature); //获取方法名 String methodName = signature.getName(); System.out.println("methodName:"+methodName); List<Object> list = Arrays.asList(args); Object result = null; try { try{ //目标方法之前要执行的操作 System.out.println("[环绕日志]【前置通知】"+methodName+"开始了,参数为:"+list); //调用目标方法 result = joinPoint.proceed(args); //目标方法正常执行之后的操作 }finally{ //方法最终结束时执行的操作! System.out.println("[环绕日志]【后置通知】"+methodName+"结束了!"); } //目标方法正常执行之后的操作 System.out.println("[环绕日志]【返回通知】"+methodName+"返回了,返回值为:"+result); } catch (Throwable e) { //目标方法抛出异常信息之后的操作 System.out.println("[环绕日志]【异常通知】"+methodName+"出异常了,异常对象为:"+e); throw new RuntimeException(e.getMessage()); }finally{ } return result; }
package com.tyd.spring.aop; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class text { @Test public void test() { ApplicationContext ioc=new ClassPathXmlApplicationContext("bean.xml"); Math m=(Math) ioc.getBean("myEpressionMath"); m.add(10, 10); System.out.println(); m.div(10, 2); System.out.println(); m.mul(20, 10); m.add(10, 10,10); //测试异常 m.div(10, 0); } }
标签:signature 访问 cep time getbean schema 示例 ann 否则
原文地址:http://www.cnblogs.com/TYDBLOG/p/7450046.html