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实现日志打印的更多相关文章

  1. 使用Spring框架入门三:基于XML配置的AOP的使用

    一.引入Jar包 <!--测试1使用--> <dependency> <groupId>org.springframework</groupId> &l ...

  2. 一步一步深入spring(6)--使用基于XML配置的spring实现的AOP

    上节我们提到了使用基于注解实现的AOP,这节我们将用基于xml配置的方式来实现的AOP. 1.首先建立一个类,作为切面类,这个类主要用来实现注解中各种通知要实现的方法. package com.yan ...

  3. [刘阳Java]_Spring AOP基于XML配置介绍_第9讲

    基于注解配置的Spring AOP固然简单,但是这节我们会给大家介绍基于XML配置的AOP是如何应用的.为什么这么说了,因为后面我们还会介绍到Spring对Dao操作的事务管理(基于AOP的XML文件 ...

  4. Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较

    本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring  AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一 ...

  5. Spring Aop(七)——基于XML配置的Spring Aop

    转发:https://www.iteye.com/blog/elim-2396043 7 基于XML配置的Spring AOP 基于XML配置的Spring AOP需要引入AOP配置的Schema,然 ...

  6. Sping MVC不使用任何注解处理(jQuery)Ajax请求(基于XML配置)

    1. Spring Spring框架是一个轻量级的解决方案,是一个潜在的一站式商店,用于构建企业就绪的应用程序.Spring框架是一个Java平台,为开发Java应用程序提供全面的基础架构支持.Spr ...

  7. ssm整合(基于xml配置方式)

    本文是基于xml配置的方式来整合SpringMVC.Spring和Mybatis(基于注解的方式会再写一篇文章),步骤如下: (1)首先自然是依赖包的配置文件 pom.xml <project ...

  8. SpringMVC快速使用——基于XML配置和Servlet3.0

    SpringMVC快速使用--基于XML配置和Servlet3.0 1.官方文档 https://docs.spring.io/spring-framework/docs/5.2.8.RELEASE/ ...

  9. 实例化Bean的方法(基于xml配置)-http://blog.csdn.net/shymi1991/article/details/48153293

    实例化Bean的方法(基于xml配置) 标签: spring framework 2015-09-01 13:43 918人阅读 评论(0) 收藏 举报  分类: Spring FrameWork(7 ...

随机推荐

  1. FZU1465

    题目链接:传送门 题目大意:给你n个整数(可正可负),求有多少个连续的子序列的和==m(时限1S) 题目思路:前缀和+手写hash(map效率太慢,会超时) 具体做法是用一个数组sum,数组的第i位保 ...

  2. mac同时安装多个jdk

    DK8 GA之后,小伙伴们喜大普奔,纷纷跃跃欲试,想体验一下Java8的Lambda等新特性,可是目前Java企业级应用的主打版本还是JDK6, JDK7.因此,我需要在我的电脑上同时有JDK8,JD ...

  3. 关于小程序报错 缺少文件,错误信息:error: iconPath=../images/home.png, file not found

    事实上在小程序中,虽然你的image文件夹是和你index文件夹的父级文件夹并行的文件夹,但是你如果引用的时候,不用去遵循    ../   或者   ./因为在小程序当中他根本不识别.所以要引用的话 ...

  4. Spring容器初始化的时候如何添加一个定时器?

    昨天遇到这个问题,在项目启动的时候添加一个定时器隔一段时间扫描有没有定时发送的邮件(当然也可以是你自己的业务逻辑),也在网上找了资料,加上自己的修改,终于成功了.所以来做个记录. 1.ServletC ...

  5. mysql 数据库备 及移动当天数据到历史表里 window下可用

    1 数据移动到历史表中,同时删除当天数据 test-move-record.bat c: cd C:\FQ_ManageServer\mysqlback mysql.exe -h 10.71.1.23 ...

  6. C/C++运算符及其优先级

    1.自增自减 (1)前置运算:"先变后用"   如++i. 后置运算:"先用后变"   如i--. 比如: int i = 5. y1 = ++i: y2 = ...

  7. 商业模式画布模板——From 《商业模式新生代》

    看过<商业模式新生代>这本书,确实受益匪浅.书籍本身编写的形式很新颖,以此为模板可以启发自己对于商业模式的思考和定义,五星推荐!!! 下面是用PPT重新绘制的商业模式画布以及说明,希望对大 ...

  8. windows下的Mysql安装与基本使用(zip)

    一.安装过程 Mysql社区版下载地址:http://dev.mysql.com/downloads/mysql/ --注意,已管理员身份运行cmd.exe,很重要!!目录在,c:\windows\s ...

  9. JFinal项目搭建

    1.Myeclipse中 新建 Dynamic Web Project   导入jar包 2.配置web.xml <?xml version="1.0" encoding=& ...

  10. BFC(Block Formatting Context)基础分析

    W3C官方对于BFC的描述只有3小段,强烈建议想理解BFC的朋友先去看看,链接见文末. 常见的文档流分为:定位流.浮动流.普通流3种.BFC是普通流中的一种. 本文提出3个问题并给出使用BFC来解决这 ...