利用Spring的AOP记录代码跟踪日志

本贴最后更新于 3979 天前,其中的信息可能已经天翻地覆

    转眼间又有好一段时间没更新博客了,今天写一篇利用Spring的AOP 来记录代码跟踪日志的

一般的程序过都会记录日志,而且会在方法开始和结束的时候都会打一条日志,这样当程序出错的时候,可以根据日志信息很快的定位错误,但是这需要在每个方法都要写重复而又单调的记录方法开始和结束的代码,

而面向切面的编程(AOP)正好可以完成在方法开始或结束的时候插入代码的工作,而Spring对AOP有很好的支持,下面我们就来用Spring的AOP来完成记录代码跟踪日志的工作。

 

第一、先创建一个javaWeb项目,不一定是Web项目,因为我们这里用不到web的东西,然后将所必需的jar包考进来,

spring-context-3.1.3.RELEASE.jar

spring-core-3.1.3.RELEASE.jar

spring-expression-3.1.3.RELEASE.jar

spring-beans-3.1.3.RELEASE.jar

spring-asm-3.1.3.RELEASE.jar

然后还有AOP所需要的包,

spring-aop-3.1.3.RELEASE.jar

spring-aspects-3.1.3.RELEASE.jar

由于Spring是用aspectJ实现的AOP所以还需要aspectJ的包

aspectjrt.jar

aspectjtools.jar

aspectjweaver.jar

org.aspectj.matcher.jar

还有面向切面编程联盟的一个包,aopalliance-1.0.jar

再就是commons-logging.jar包了

总共13个jar包,少一个都不行!!!

第二,编写我们的测试类

    假设我们测试类TestServiceImpl 里的方法添加日志,先写该类的接口ITestService

package com.service;

import java.util.List;

/**
* 项目名称:test_Spring_AOP
* 类 名 称:ITest
* 类 描 述:
* 创 建 人:yaohx
* 创建时间:2013-8-2 上午10:42:02
* 修 改 人:yaohx
* 修改时间:2013-8-2 上午10:42:02
* 修改备注:
* @version
*/

public interface ITestService {
public void test(String testStr,int age,List list);
}

然后是TestServiceImpl类

 

package com.service;
import java.util.List;
/**
* 项目名称:test_Spring_AOP
* 类 名 称:User
* 类 描 述:
* 创 建 人:yaohx
* 创建时间:2013-8-2 上午10:08:40
* 修 改 人:yaohx
* 修改时间:2013-8-2 上午10:08:40
* 修改备注:
* @version
*/

public class TestServiceImpl implements ITestService {
public void test(String testStr,int age,List list){
System.out.println("Test.test。。。。");
}
}

 

然后就是切面类

 

package com.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;

/**
* 项目名称:test_Spring_AOP
* 类 名 称:Aspect
* 类 描 述:
* 创 建 人:yaohx
* 创建时间:2013-8-2 上午10:11:23
* 修 改 人:yaohx
* 修改时间:2013-8-2 上午10:11:23
* 修改备注:
*
* @version
*/
@Aspect//该注解标明该类为切面类
public class AspectTest {

//该注解标明要作用到哪个类以及哪个目标方法上,以及什么时候触发,我们这里只用@Around(目标方法运行前后都运行该方法)

//"execution(* com.service.*.*(..))"表示com.service包下的所有方法的所有类

@Around("execution(* com.service.*.*(..))")

public void aspect(ProceedingJoinPoint jp) throws Throwable {

//记录方法开始日志(这里为打印到控制台)
System.out.println(jp.getTarget().getClass().getName()+"."+((MethodSignature) jp.getSignature()).getMethod().getName() + " Start。。。。。");
//获得目标方法的参数
Object[] params = jp.getArgs();
//将参数拼成一个字符串
StringBuffer msg = new StringBuffer();
msg.append("params:");
for (Object object : params) {
msg.append(object+ ",");
}
//将方法的参数记录到日志中(这里为打印到控制台)
System.out.println(msg.toString());
//执行目标方法并得到其返回值
Object rtn = jp.proceed(jp.getArgs());
//记录方法结束日志,以及方法的返回结果
System.out.println(jp.getTarget().getClass().getName()+"."+((MethodSignature) jp.getSignature()).getMethod().getName() + " end。。。。。return:" + rtn);
}
}

 

该类的注释写的很清楚,这里就不再一一解释了,

第三,编写,Spring 的配置文件,applicationContext.xml,放到ClassPath下

<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 启动对@AspectJ注解的支持 -->
<aop:aspectj-autoproxy/>
<bean name="aspectTest" class="com.aspect.AspectTest"></bean>
<bean name="test" class="com.service.TestServiceImpl"></bean>
</beans>

 

要使用Spring的AOP功能,要在配置文件中添加Spring IOC以及AOP的schema 

xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" 
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

并启动对AspectJ的支持

<aop:aspectj-autoproxy/>

然后将我们的测试类以及切面类交由Spring来管理

<bean name="aspectTest" class="com.aspect.AspectTest"></bean>
<bean name="test" class="com.service.TestServiceImpl"></bean>

 

好,大功告成了,让我们来测试一下吧

 

package com.test;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.service.ITestService;

/**
* 项目名称:test_Spring_AOP
* 类 名 称:TestMain
* 类 描 述:
* 创 建 人:yaohx
* 创建时间:2013-8-2 上午10:17:47
* 修 改 人:yaohx
* 修改时间:2013-8-2 上午10:17:47
* 修改备注:
* @version
*/

public class TestMain {
public static void main(String[] args) {
//拿到Spring的BeanFactory
ClassPathXmlApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");
//从Spring的IOC容器中拿到我们的测试类
ITestService test = (ITestService)factory.getBean("test");
List l = new ArrayList();
l.add("list1");
l.add("list2");
l.add("list3");
//这行测试类的方法
test.test("qweqwe",123123,l);
}
}

 

看一下运行结果

 

2013-8-11 22:25:29 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@59bca5f1: startup date [Sun Aug 11 22:25:29 CST 2013]; root of context hierarchy
2013-8-11 22:25:29 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
2013-8-11 22:25:30 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@54acb158: defining beans [org.springframework.aop.config.internalAutoProxyCreator,aspectTest,test]; root of factory hierarchy

前边是Sring的初始化工作,不用管他,下边才是我们想要的结果


com.service.TestServiceImpl.test Start。。。。。----------------------方法开始日志(类全名,方法名)
params:qweqwe,123123,[list1, list2, list3],---------------------------方法传入的实参
Test.test。。。。----------------------------------------------------方法的执行内容
com.service.TestServiceImpl.test end。。。。。return:null--------------方法的结束日志,以及返回结果(这里该方法的返回类型为void所以为null)

 

欧耶。。。。  成功!!!!

  • AOP
    21 引用 • 13 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    942 引用 • 1458 回帖 • 118 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • zonghua

    Log4J 这类也是不是利用 AOP 远离?

推荐标签 标签

  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    332 引用 • 619 回帖 • 1 关注
  • 反馈

    Communication channel for makers and users.

    124 引用 • 907 回帖 • 210 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    45 引用 • 25 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    328 引用 • 1706 回帖 • 1 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 192 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 391 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖 • 1 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖 • 2 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    493 引用 • 1385 回帖 • 341 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    536 引用 • 672 回帖
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    921 引用 • 934 回帖 • 1 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 399 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 4 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 26 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    40 引用 • 40 回帖 • 1 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 6 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 10 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 254 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 233 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 60 回帖 • 457 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 247 回帖 • 148 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 181 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 708 关注