spring中面向切面编程AOP的简单应用

来源:互联网 发布:人声模拟软件 编辑:程序博客网 时间:2024/06/04 19:38

1-横切关注点:在什么时间点,执行什么操作
        2-切面:横切关注点的模块化        是横切关注点的抽象化
        3-连接点:核心关注点的某一个执行点
        4-切入点:对连接点的表达式定义
        5-通知:拦截到连接点之后要做的事;分为:  前置  后置   异常   返回  环绕

1.在调用一个类的方法前和方法后打印一些日志信息;

通知分为:前置  后置   异常   返回  环绕

以下实例演示这几种情况的通知:

封装一个MyMath类,定义add方法

package com.bean.aop;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyMath {public int add(int num1,int num2){int result=num1+num2;System.out.println(result);//int num=1/0;//System.out.println(result+"************");return result;}}
其中要求:
                    1.在add方法执行前打印"运行前,参数是“;

                    2.在add方法执行后打印“运行后,运行方法结束”;

package com.bean.aop;import java.util.Arrays;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;public class Log {public void before(JoinPoint p){Object[] os=p.getArgs();System.out.println("运行前,参数是"+Arrays.asList(os));}public void after(JoinPoint p){String name=p.getSignature().getName();System.out.println(name+"运行后,运行方法结束");}public void returnMethod(JoinPoint p,Object result){String name=p.getSignature().getName();System.out.println("运行结果是"+result);}public void returnException(JoinPoint p,Exception e){System.out.println("运行出错"+e.getMessage());}}

spring主配置文件:

<bean id="myMath" class="com.bean.aop.MyMath"></bean><bean id="log" class="com.bean.aop.Log"></bean><!-- 配置aop --> <aop:config><!-- 配置切点表达式 --> <!-- <aop:pointcut expression="execution(public int com.bean.aop.MyMath.*(int,int))" id="pc"/> --><aop:pointcut expression="execution(* com.bean.aop.*.*(..))" id="pc"/><aop:aspect ref="log"><aop:before method="before" pointcut-ref="pc"/><aop:after method="after" pointcut-ref="pc"/><aop:after-returning method="returnMethod" pointcut-ref="pc" returning="result"/><aop:after-throwing method="returnException" pointcut-ref="pc" throwing="e"/><!-- <aop:around method="returnAround" pointcut-ref="pc"/> --></aop:aspect></aop:config>
测试类:

package com.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.bean.aop.MyMath;public class MyMathTest {public static void main(String[] args) {ApplicationContext ac=new ClassPathXmlApplicationContext("beans-aop.xml");MyMath myMath=ac.getBean(MyMath.class);int result=myMath.add(1, 2);}}

运行结果:

由打印结果分析到:前置,后置,返回都正常运行;

(2)以下演示异常通知;

package com.bean.aop;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyMath {public int add(int num1,int num2){int result=num1+num2;System.out.println(result);int num=1/0;//手动添加异常,触发异常//System.out.println(result+"************");return result;}}
运行结果:


有上述运行结果可以分析到到异常通知触发后返回通知就不运行,而前置和后置通知则正常运行;相反如果返回通知正常运行(即无异常发生方法正确执行时)异常通知则不发生,前置和后置通知正常运行;

(3)以下演示环绕通知:

package com.bean.aop;import java.util.Arrays;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;public class Log {public Object returnAround(ProceedingJoinPoint p){String name=p.getSignature().getName();Object[] os=p.getArgs();Object result=null;System.out.println("运行前,参数是"+Arrays.asList(os));try {result=p.proceed();System.out.println("运行结果是"+result);} catch (Throwable e) {System.out.println("运行出错"+e.getMessage());}System.out.println(name+"运行后,运行方法结束");return result;}}
spring的核心配置文件:

<?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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans                          http://www.springframework.org/schema/beans/spring-beans-4.0.xsd                          http://www.springframework.org/schema/context                          http://www.springframework.org/schema/context/spring-context-4.0.xsd                          http://www.springframework.org/schema/mvc                          http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd                        http://www.springframework.org/schema/aop                         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd                        http://www.springframework.org/schema/tx                         http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"><bean id="myMath" class="com.bean.aop.MyMath"></bean><bean id="log" class="com.bean.aop.Log"></bean><aop:config><!-- <aop:pointcut expression="execution(public int com.bean.aop.MyMath.*(int,int))" id="pc"/> --><aop:pointcut expression="execution(* com.bean.aop.*.*(..))" id="pc"/><aop:aspect ref="log"><aop:around method="returnAround" pointcut-ref="pc"/></aop:aspect></aop:config></beans>
运行结果:

无异常通知发生时:


有异常通知发生时;

手动触发异常测试:

package com.bean.aop;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyMath {public int add(int num1,int num2){int result=num1+num2;System.out.println(result);int num=1/0;//手动触发异常测试//System.out.println(result+"************");return result;}public int sub(int num1,int num2){int result=num1-num2;System.out.println(result);return result;}}


触发异常通知;


原创粉丝点击