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;}}
触发异常通知;
阅读全文
0 0
- spring中面向切面编程AOP的简单应用
- 简单理解Spring中AOP(面向切面编程)
- spring Aop 面向切面编程简单实例
- 武林秘籍之Spring AOP 切面编程的简单应用
- Spring 的AOP(面向切面编程)
- spring的AOP面向切面编程
- spring 面向切面编程AOP的原理
- 关于Spring的AOP面向切面编程
- Spring 的面向切面编程(AOP)
- Spring的AOP-面向切面编程
- Spring的AOP面向切面编程
- spring的AOP--面向切面编程
- AOP-Spring的面向切面编程
- Spring的面向切面编程AOP
- Spring的AOP面向切面编程
- spring面向切面编程(aop)
- Spring AOP 面向切面编程
- Spring AOP 面向切面编程
- Mac原生解决ntfs格式只能读不能写
- button按钮的四种监听之一
- ActiveMQ的入门
- Nginx实现原理
- java.lang.RuntimeException: Unable to instantiate activity ComponentInfo类似问题解决办法
- spring中面向切面编程AOP的简单应用
- 程序员为什么要写博客
- 日本穷游攻略(3、开销参考)
- 新建的maven项目pox.xml报错
- 创建一个HelloQuartz
- Redis实现原理及作用
- [bzoj2239] 猜谜 迭代深搜 or 动态规划
- java库Html2Image:实现html转图片功能
- ssm+shiro