基于XML配置的AOP实现日志打印
Spring中可以使用注解或XML文件配置的方式实现AOP。
1、导入jar包
- com.springsource.net.sf.cglib -2.2.0.jar
- com.springsource.org.aopalliance-1.0.0 .jar
- com.springsource.org.aspectj.weaver-1.6.8 .RELEASE.jar
- commons-logging-1.1.3. jar
- spring-aop-4.0.0.RELEASE.jar
- spring-aspects-4.0.0.RELEASE.jar
- spring-beans-4.0.0.RELEASE.jar
- spring-context-4.0.0.RELEASE.jar
- spring-core-4.0.0.RELEASE.jar
- spring-expression-4.0.0.RELEASE.jar
aspectaop相关jar包 ---> 资源目录--->jar包资源--->AOP日志打印相关jar包(切面类)
Spring相关jar包 ---> 资源目录--->jar包资源--->Spring相关jar包
2、新建代理类和切面类
@Component
public class MathCalculator {
public void add(int i, int j) {
int result=i+j;
System.out.println("目标方法add(int)执行了");
}
public void sub(int i, int j) {
int result=i-j;
System.out.println("目标方法sub执行了");
}
public void mult(int i, int j) {
int result=i*j;
System.out.println("目标方法mult执行了");
}
public void div(int i, int j) {
int result=i/j;
System.out.println("目标方法div执行了");
}
}
MathCalculator
切面类1:LogAspectp1:声明4中通知方法,Before、After、AfterThrowing、AfterReturning
public class LogAspectp1{
public void showBeginLog(JoinPoint jPoint){
Object[] args = jPoint.getArgs();//获取方法参数
List<Object> asList = Arrays.asList(args);//转化成List集合
Signature signature = jPoint.getSignature();
String name = signature.getName();//获取方法的名字
System.out.println("LogAspectp1-----AOP日志开始");
System.out.println("目标方法名:"+name+",参数列表:"+asList);
}
public void showAfterLog(){
System.out.println("LogAspectp1-----AOP方法结束");
}
public void showExceptionLog(Exception ex){
System.out.println("LogAspectp1-----AOP方法异常");
System.out.println("异常信息:"+ex.getMessage());
}
public void showReturnLog(Object result){
System.out.println("方法返回值:"+result);
System.out.println("LogAspectp1-----AOP方法最终返回");
}
}
切面类2:LogAspectp2:声明Around通知方法,代替前面的4中通知
public class LogAspectp2{
public Object showLog(ProceedingJoinPoint point){
Object[] args = point.getArgs();
List<Object> asList = Arrays.asList(args);
Signature signature = point.getSignature();
String name = signature.getName();
Object result = null;
try {
try {
//目标方法之前要执行的操作,相当于@before
System.out.println("LogAspect2-----[环绕日志]"+name+"开始了,参数为:"+asList);
//调用目标方法
result = point.proceed(args);
} finally {
//方法最终结束时执行的操作,相当于@after
System.out.println("LogAspect2-----[环绕日志]"+name+"结束了!");
}
//目标方法正常执行之后的操作,相当于@AfterReturning
System.out.println("LogAspect2-----[环绕日志]"+name+"返回了,返回值为:"+result);
} catch (Throwable e) {
//目标方法抛出异常信息之后的操作,相当于@AfterThrowing
System.out.println("LogAspect2-----[环绕日志]"+name+"出异常了,异常对象为:"+e);
throw new RuntimeException(e.getMessage());
}
return result;
}
}
3、在Spring的配置文件applicationContext.xml中进行配置
<!-- 将需要加载到IOC容器中的bean配置好 -->
<bean id="mathCalculator" class="com.bwlu.common.MathCalculator"></bean>
<bean id="logAspectp1" class="com.bwlu.common.LogAspectp1"></bean>
<bean id="logAspectp2" class="com.bwlu.common.LogAspectp2"></bean>
<!-- 配置AOP,需要导入AOP名称空间 -->
<aop:config>
<!-- 声明切入点表达式 -->
<aop:pointcut expression="execution(public * com.bwlu.aop.MathCalculatorImpl.*(..))" id="pointcut"/>
<!-- 配置日志切面类,引用前面的类 ,通过order属性控制优先级-->
<aop:aspect ref="logAspectp1" order="20">
<!-- 通过method属性指定切面类的切面方法,通过pointcut-ref指定切入点表达式 -->
<aop:before method="showBeginLog" pointcut-ref="pointcut"/>
<aop:after method="showAfterLog" pointcut-ref="pointcut"/>
<aop:after-throwing method="showExceptionLog" pointcut-ref="pointcut" throwing="ex"/>
<aop:after-returning method="showReturnLog" pointcut-ref="pointcut" returning="result"/>
</aop:aspect>
<aop:aspect ref="logAspectp2" order="10">
<aop:around method="showLog" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
4、新建Junit测试类进行测试
ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
@Test
public void test() {
//需要进行强转,如果该类实现了一个接口(并且切入点表达式指向这个类),那么获取到的将不是该类的对象,需要强转
//MathCalculatorImpl实现了MathCalculator接口,则
//MathCalculator bean = (MathCalculator)ioc.getBean("mathCalculatorImpl");
MathCalculator bean = (MathCalculator)ioc.getBean("mathCalculator");
bean.add(10, 5);
System.out.println();
bean.add(10.0, 5);
System.out.println();
bean.sub(10, 5);
System.out.println();
bean.mult(10, 5);
System.out.println();
bean.div(10, 0);
}
运行结果:
LogAspectp2-----[环绕日志]add开始了,参数为:[10, 5]
LogAspectp1-----AOP日志开始
目标方法名:add,参数列表:[10, 5]
目标方法add(int)执行了
LogAspectp1-----AOP方法结束
方法返回值:null
LogAspectp1-----AOP方法最终返回
LogAspectp2-----[环绕日志]add结束了!
LogAspectp2-----[环绕日志]add返回了,返回值为:null LogAspectp2-----[环绕日志]add开始了,参数为:[10.0, 5.0]
LogAspectp1-----AOP日志开始
目标方法名:add,参数列表:[10.0, 5.0]
目标方法add(double)执行了
LogAspectp1-----AOP方法结束
方法返回值:15.0
LogAspectp1-----AOP方法最终返回
LogAspectp2-----[环绕日志]add结束了!
LogAspectp2-----[环绕日志]add返回了,返回值为:15.0 LogAspectp2-----[环绕日志]sub开始了,参数为:[10, 5]
LogAspectp1-----AOP日志开始
目标方法名:sub,参数列表:[10, 5]
目标方法sub执行了
LogAspectp1-----AOP方法结束
方法返回值:null
LogAspectp1-----AOP方法最终返回
LogAspectp2-----[环绕日志]sub结束了!
LogAspectp2-----[环绕日志]sub返回了,返回值为:null LogAspectp2-----[环绕日志]mult开始了,参数为:[10, 5]
LogAspectp1-----AOP日志开始
目标方法名:mult,参数列表:[10, 5]
目标方法mult执行了
LogAspectp1-----AOP方法结束
方法返回值:null
LogAspectp1-----AOP方法最终返回
LogAspectp2-----[环绕日志]mult结束了!
LogAspectp2-----[环绕日志]mult返回了,返回值为:null LogAspectp2-----[环绕日志]div开始了,参数为:[10, 0]
LogAspectp1-----AOP日志开始
目标方法名:div,参数列表:[10, 0]
LogAspectp1-----AOP方法结束
LogAspectp1-----AOP方法异常
异常信息:/ by zero
LogAspectp2-----[环绕日志]div结束了!
LogAspectp2-----[环绕日志]div出异常了,异常对象为:java.lang.ArithmeticException: / by zero
运行结果
基于XML配置的AOP实现日志打印的更多相关文章
- 使用Spring框架入门三:基于XML配置的AOP的使用
一.引入Jar包 <!--测试1使用--> <dependency> <groupId>org.springframework</groupId> &l ...
- 一步一步深入spring(6)--使用基于XML配置的spring实现的AOP
上节我们提到了使用基于注解实现的AOP,这节我们将用基于xml配置的方式来实现的AOP. 1.首先建立一个类,作为切面类,这个类主要用来实现注解中各种通知要实现的方法. package com.yan ...
- [刘阳Java]_Spring AOP基于XML配置介绍_第9讲
基于注解配置的Spring AOP固然简单,但是这节我们会给大家介绍基于XML配置的AOP是如何应用的.为什么这么说了,因为后面我们还会介绍到Spring对Dao操作的事务管理(基于AOP的XML文件 ...
- Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较
本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一 ...
- Spring Aop(七)——基于XML配置的Spring Aop
转发:https://www.iteye.com/blog/elim-2396043 7 基于XML配置的Spring AOP 基于XML配置的Spring AOP需要引入AOP配置的Schema,然 ...
- Sping MVC不使用任何注解处理(jQuery)Ajax请求(基于XML配置)
1. Spring Spring框架是一个轻量级的解决方案,是一个潜在的一站式商店,用于构建企业就绪的应用程序.Spring框架是一个Java平台,为开发Java应用程序提供全面的基础架构支持.Spr ...
- ssm整合(基于xml配置方式)
本文是基于xml配置的方式来整合SpringMVC.Spring和Mybatis(基于注解的方式会再写一篇文章),步骤如下: (1)首先自然是依赖包的配置文件 pom.xml <project ...
- SpringMVC快速使用——基于XML配置和Servlet3.0
SpringMVC快速使用--基于XML配置和Servlet3.0 1.官方文档 https://docs.spring.io/spring-framework/docs/5.2.8.RELEASE/ ...
- 实例化Bean的方法(基于xml配置)-http://blog.csdn.net/shymi1991/article/details/48153293
实例化Bean的方法(基于xml配置) 标签: spring framework 2015-09-01 13:43 918人阅读 评论(0) 收藏 举报 分类: Spring FrameWork(7 ...
随机推荐
- SpringMVC学习(十一)——SpringMVC实现Resultful服务
http://blog.csdn.net/yerenyuan_pku/article/details/72514034 Restful就是一个资源定位及资源操作的风格,不是标准也不是协议,只是一种风格 ...
- [原创]adb使用教程v1.1.0-----by-----使用logcat快速抓取android崩溃日志
原文再续,书接上回:<使用logcat快速抓取android崩溃日志>中提到的工具包可以下载拉~ <使用logcat快速抓取android崩溃日志>:http://www.cn ...
- HDU 5892 Resident Evil
题目链接:传送门 题目大意:有50种动物,给你n*n的矩阵,m次操作,P代表加入操作,在左上角 x1,y1 到右下角 x2,y2,的矩形范围内加入 种类为x,数量为y的动物. Q代表询问操作,在左上角 ...
- vertical-align 使用参考
在实现文字与图片垂直对齐的时候,发现了vertical-align的值也是很纷繁复杂,博客讲解各种不懂,最终还是找了CSS权威指南-中文第三版,看了前6章,终于弄明白了,如果你也有不懂的地方,请去看书 ...
- Selenium Firefox 官方Webdriver -- Geckodriver 下载地址
Selenium Firefox 官方Webdriver -- Geckodriver 下载地址 https://github.com/mozilla/geckodriver/releases
- FW: git internal
Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式.我个人发现学习这些内容对于理解 Git 的用处和强大是非常重要的, ...
- Java中的(构造方法、方法重载、final修饰符使用及继承和抽象)
构造方法: 构造方法的名称和类名相同,没有返回类型,参数列表(类型.个数)不同 方法重载:成员方法和构造方法都可以进行重载 方法名相同但是参数列表(类型,个数)不同,成为方法的重载. 继承:直支持单继 ...
- OVN实战---《A Primer on OVN》翻译
overview 在本文中,我们将在三个host之间创建一个简单的二层overlay network.首先,我们来简单看一下,整个系统是怎么工作的.OVN基于分布式的control plane,其中各 ...
- window安装redis数据库
1.下载安装包 1.百度网盘链接:https://pan.baidu.com/s/1MrAK5Suc1xpzkbp1WQbP0A 提取码:u9uq 2.GitHub:https://github.co ...
- Vue(6)- Vue-router进阶、单页面应用(SPA)带来的问题
一.Vue-router进阶 回顾学过的vue-router,并参考官方文档学习嵌套路由等路由相关知识. 二.单页面应用(SPA)带来的问题 1.虽然单页面应用有优点,但是,如果后端不做服务器渲染(h ...