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. android 127.0.0.1/localhost connection refused,在模拟器上应该用10.0.2.2访问你的电脑本机

    调试中通过android simulator模拟器链接localhost或者127.0.0.1,因为我在电脑上面建立了apache,我的代码大概就是URL url = new URL(urlStrin ...

  2. boost::interprocess::shared_memory_object(1)(基本类型)

    #include <iostream> #include <boost/interprocess/managed_shared_memory.hpp> struct pos2d ...

  3. 160705、总结:commons-codec.jar中常用方法

    一.Base64编码和解码import org.apache.commons.codec.EncoderException;import org.apache.commons.codec.binary ...

  4. POJ 3150 Cellular Automaton(矩阵快速幂)

    Cellular Automaton Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 3504 Accepted: 1421 C ...

  5. 数据库系统概述(Data Model、DBMS、DBS、RDBS、Structured Query Language)

    数据Data 描述事物的符号记录成为数据. 数据是数据库中存储的基本对象.   除了基本的数字之外.像图书的名称.价格.作者都可以称为数据. 将多种数据记录列成一张表.通过数据表管理数据. 每一行的数 ...

  6. Log4j 2

    Log4j – Apache Log4j 2 - Apache Log4j 2 http://logging.apache.org/log4j/2.x/ Apache Log4j 2 Apache L ...

  7. css3的3d属性集合

    css3的3d属性集合 想进入css3的3d世界必须知道一下几个属性及其用法. 当然在进入属性介绍之前我想你必须知道3维坐标,附上一张经典图如下: 我想不用解释了吧.之后要平移和旋转都是在这个基础之上 ...

  8. android问题总结

    1.当打开eclipse时出现如下窗口(内容如下) Error when loading the SDK: Error: Error parsing \Android\adt-bundle-windo ...

  9. 异常处理、socke基于TCP协议编程

    一.异常处理 1.错误和异常 1.程序中难免出现错误,而错误分成两种 (1)语法错误(这种错误过不了Python解释器的语法检测,必须在程序执行前改正) #语法错误示范一 if #语法错误示范二 de ...

  10. 怎样优雅的管理ActionBar

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/50997095 本文出自:[顾林海的博客] 前言 随着项目越来越大.页面 ...