SSH框架系列:Spring AOP应用记录日志Demo

分类: 【java】2013-12-10 18:53 724人阅读 评论(0) 收藏 举报

1.简介

Spring 中的AOP为Aspect Oriented Programming的缩写,面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。以下是Spring AOP的小例子

源代码:https://github.com/nuptboyzhb/SpringAOPDemo

2.例子简介

2.1切面aspect:Logging.java

[java] view plaincopy

  1. /*
  2. * $filename: Logging.java,v $
  3. * $Date: 2013-12-10  $
  4. * Copyright (C) ZhengHaibo, Inc. All rights reserved.
  5. * This software is Made by Zhenghaibo.
  6. */
  7. package edu.njupt.zhb;
  8. /*
  9. *@author: ZhengHaibo
  10. *web:     http://blog.csdn.net/nuptboyzhb
  11. *mail:    [email protected]
  12. *2013-12-10  Nanjing,njupt,China
  13. */
  14. public class Logging {
  15. public void beforeAdvice(){
  16. System.out.println("Logging:before... ");
  17. }
  18. public void afterAdvice(){
  19. System.out.println("Logging:after... ");
  20. }
  21. /**
  22. *
  23. * @param retVal 函数的返回值
  24. */
  25. public void afterReturningAdvice(Object retVal){
  26. if(retVal==null){
  27. return;
  28. }
  29. System.out.println("Logging:return :"+retVal.toString());
  30. }
  31. public void afterThrowingAdvice(IllegalArgumentException ex){
  32. System.out.println("Logging:exception:"+ex.toString());
  33. }
  34. }

2.2Bean: Student.java

[java] view plaincopy

  1. /*
  2. * $filename: Student.java,v $
  3. * $Date: 2013-12-10  $
  4. * Copyright (C) ZhengHaibo, Inc. All rights reserved.
  5. * This software is Made by Zhenghaibo.
  6. */
  7. package edu.njupt.zhb;
  8. /*
  9. *@author: ZhengHaibo
  10. *web:     http://blog.csdn.net/nuptboyzhb
  11. *mail:    [email protected]
  12. *2013-12-10  Nanjing,njupt,China
  13. */
  14. public class Student {
  15. private String id;
  16. private String name;
  17. public String getId() {
  18. return id;
  19. }
  20. public void setId(String id) {
  21. this.id = id;
  22. }
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. public void printThrowException(){
  30. System.out.println("Exception in Student.class...");
  31. throw new IllegalArgumentException("Exception from Student...");
  32. }
  33. public void print(String say){
  34. System.out.println("Say:"+say+",Name = "+name);
  35. }
  36. }

2.3xml文件配置

[html] view plaincopy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  8. http://www.springframework.org/schema/aop
  9. http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
  10. <!-- 切面类 -->
  11. <bean id="myLogging" class="edu.njupt.zhb.Logging"></bean>
  12. <!-- AOP配置 -->
  13. <aop:config>
  14. <aop:aspect id="logStudent" ref="myLogging">
  15. <!-- pointcut配置 -->
  16. <aop:pointcut id="allMethod" expression="execution(* edu.njupt.zhb.*.*(..))"/>
  17. <aop:before pointcut-ref="allMethod" method="beforeAdvice"/>
  18. <aop:after  pointcut-ref="allMethod" method="afterAdvice"/>
  19. <aop:after-returning pointcut-ref="allMethod" returning="retVal" method="afterReturningAdvice"/>
  20. <aop:after-throwing pointcut-ref="allMethod" throwing="ex" method="afterThrowingAdvice"/>
  21. </aop:aspect>
  22. </aop:config>
  23. <bean id="student" class="edu.njupt.zhb.Student">
  24. <property name="id" value="1012010638"></property>
  25. <property name="name" value="Haibo Zheng"></property>
  26. </bean>
  27. </beans>

2.4测试

[java] view plaincopy

  1. package edu.njupt.zhb;
  2. /*
  3. * $filename: TestMain.java,v $
  4. * $Date: 2013-12-10  $
  5. * Copyright (C) ZhengHaibo, Inc. All rights reserved.
  6. * This software is Made by Zhenghaibo.
  7. */
  8. import org.springframework.context.ApplicationContext;
  9. import org.springframework.context.support.ClassPathXmlApplicationContext;
  10. /*
  11. *@author: ZhengHaibo
  12. *web:     http://blog.csdn.net/nuptboyzhb
  13. *mail:    [email protected]
  14. *2013-12-10  Nanjing,njupt,China
  15. */
  16. public class TestMain {
  17. /**
  18. * @param args
  19. */
  20. public static void main(String[] args) {
  21. // TODO Auto-generated method stub
  22. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  23. Student student = (Student)context.getBean("student");
  24. System.out.println("-------------");
  25. student.getId();
  26. System.out.println("-------------");
  27. student.getName();
  28. System.out.println("-------------");
  29. student.print("Hi,I am a student");
  30. System.out.println("-------------");
  31. try{
  32. student.printThrowException();
  33. }catch (Exception e) {
  34. // TODO: handle exception
  35. System.out.println(e.getMessage());
  36. }
  37. }
  38. }

2.5运行结果:

[plain] view plaincopy

  1. 2013-12-10 18:32:54 org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2. 信息: Refreshing org[email protected]145e044: display name [org[email protected]145e044]; startup date [Tue Dec 10 18:32:54 CST 2013]; root of context hierarchy
  3. 2013-12-10 18:32:54 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. 信息: Loading XML bean definitions from class path resource [applicationContext.xml]
  5. 2013-12-10 18:32:54 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
  6. 信息: Bean factory for application context [org[email protected]145e044]: org.s[email protected]1f4cbee
  7. 2013-12-10 18:32:54 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  8. 信息: Pre-instantiating singletons in org.s[email protected]1f4cbee: defining beans [myLogging,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0,org.springframework.aop.aspectj.AspectJPointcutAdvisor#1,org.springframework.aop.aspectj.AspectJPointcutAdvisor#2,org.springframework.aop.aspectj.AspectJPointcutAdvisor#3,allMethod,student]; root of factory hierarchy
  9. -------------
  10. Logging:before...
  11. Logging:after...
  12. Logging:return :1012010638
  13. -------------
  14. Logging:before...
  15. Logging:after...
  16. Logging:return :Haibo Zheng
  17. -------------
  18. Logging:before...
  19. Say:Hi,I am a student,Name = Haibo Zheng
  20. Logging:after...
  21. -------------
  22. Logging:before...
  23. Exception in Student.class...
  24. Logging:after...
  25. Logging:exception:java.lang.IllegalArgumentException: Exception from Student...
  26. Exception from Student...

上述的方法只是在执行函数前,加一些自己的逻辑。如果完成更加复杂的功能,我们可能需要知道函数的名称以及函数的参数及其值等等信息。此时,我们只需要修改Logging类即可,可以修改为如下:(主要是使用了Spring aop中的JointPoint)

[java] view plaincopy

  1. /*
  2. * $filename: Logging.java,v $
  3. * $Date: 2013-12-10  $
  4. * Copyright (C) ZhengHaibo, Inc. All rights reserved.
  5. * This software is Made by Zhenghaibo.
  6. */
  7. package edu.njupt.zhb;
  8. import org.aspectj.lang.JoinPoint;
  9. /*
  10. *@author: ZhengHaibo
  11. *web:     http://blog.csdn.net/nuptboyzhb
  12. *mail:    [email protected]
  13. *2013-12-10  Nanjing,njupt,China
  14. */
  15. public class Logging {
  16. public void beforeAdvice(JoinPoint jointPoint){
  17. Object methodArgs[] = jointPoint.getArgs();//获取切入点函数的参数
  18. for(Object arg:methodArgs){
  19. System.out.println("Logging:args type="+arg.getClass().getName());
  20. System.out.println("Logging:args value="+arg);
  21. }
  22. System.out.println("Logging:ClassName="+jointPoint.getTarget().getClass().getName());
  23. System.out.println("Logging:MethodName="+jointPoint.getSignature().getName());
  24. System.out.println("Logging:before... ");
  25. }
  26. public void afterAdvice(){
  27. System.out.println("Logging:after... ");
  28. }
  29. /**
  30. *
  31. * @param retVal 函数的返回值
  32. */
  33. public void afterReturningAdvice(Object retVal){
  34. if(retVal==null){
  35. return;
  36. }
  37. System.out.println("Logging:return :"+retVal.toString());
  38. }
  39. public void afterThrowingAdvice(IllegalArgumentException ex){
  40. System.out.println("Logging:exception:"+ex.toString());
  41. }
  42. }

此时的运行结果为:

[java] view plaincopy

  1. 2013-12-10 19:44:07 org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2. 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@145e044: display name [org.springframework.context.support.ClassPathXmlApplicationContext@145e044]; startup date [Tue Dec 10 19:44:07 CST 2013]; root of context hierarchy
  3. 2013-12-10 19:44:07 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. 信息: Loading XML bean definitions from class path resource [applicationContext.xml]
  5. 2013-12-10 19:44:07 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
  6. 信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@145e044]: org.springframework.beans.factory.support.DefaultListableBeanFactory@787d6a
  7. 2013-12-10 19:44:07 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  8. 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@787d6a: defining beans [myLogging,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0,org.springframework.aop.aspectj.AspectJPointcutAdvisor#1,org.springframework.aop.aspectj.AspectJPointcutAdvisor#2,org.springframework.aop.aspectj.AspectJPointcutAdvisor#3,allMethod,student]; root of factory hierarchy
  9. -------------
  10. Logging:ClassName=edu.njupt.zhb.Student
  11. Logging:MethodName=getId
  12. Logging:before...
  13. Logging:after...
  14. Logging:return :1012010638
  15. -------------
  16. Logging:ClassName=edu.njupt.zhb.Student
  17. Logging:MethodName=getName
  18. Logging:before...
  19. Logging:after...
  20. Logging:return :Haibo Zheng
  21. -------------
  22. Logging:args type=java.lang.String
  23. Logging:args value=Hi,I am a student
  24. Logging:args type=java.lang.Integer
  25. Logging:args value=20
  26. Logging:ClassName=edu.njupt.zhb.Student
  27. Logging:MethodName=print
  28. Logging:before...
  29. Say:Hi,I am a student,Name = Haibo Zheng,age = 20
  30. Logging:after...
  31. -------------
  32. Logging:ClassName=edu.njupt.zhb.Student
  33. Logging:MethodName=printThrowException
  34. Logging:before...
  35. Exception in Student.class...
  36. Logging:after...
  37. Logging:exception:java.lang.IllegalArgumentException: Exception from Student...
  38. Exception from Student...

未经允许,不得用于商业目的

时间: 2024-10-15 06:12:57

SSH框架系列:Spring AOP应用记录日志Demo的相关文章

Spring aop 小实例demo

Hadoop从2.4.0版本开始支持hdfs的ACL,在CDH5.0当中也集成了该特性,下面对其进行一些测试: unnamed user (file owner) 文件的拥有者 unnamed group (file group) 文件的所属组 named user 除了文件的拥有者和拥有组之外,的其它用户 named group 除了文件的拥有者和拥有组之外,的其它用户 mask  权限掩码,用于过滤named user和named group的权限 一.启用ACL: <property>

用MyEclipse搭建SSH框架(Struts2 Spring Hibernate)

1.new一个web project. 2.右键项目,为项目添加Struts支持. 点击Finish.src目录下多了struts.xml配置文件. 3.使用MyEclipse DataBase Explorer建立数据源. new一个数据源.填入数据源信息. 点击test Driver,如果成功显示: 点击OK,点击Finish. 4.为项目添加Spring支持. 选择五个包,之后JAR Library Installation为如下图. 点击Next. 默认点击Finish. 5.为项目添加

SSH框架系列:Spring配置多个数据源

问题:有开源框架mysql的 ,还有旧系统 sqlserver2000的,解决这些问题总有些成长. 解决sqlserver安装环境:http://qdh68.blog.163.com/blog/static/13756126201261742437357/ 别说sqlserver2000不怎么样,最起码那友好的管理叫你明白数据库. 2.  先说配置jdbc:如果sqlserver 2000以上还好 找到jar包 ,按目录加载到maven仓库,安装一下 http://outofmemory.cn/

SSH框架系列:Spring读取配置文件以及获取Spring注入的Bean

分类: [java]2013-12-09 16:29 1020人阅读 评论(0) 收藏 举报 1.简介 在SSH框架下,假设我们将配置文件放在项目的src/datasource.properties路径下,Spring的配置文件也是src/applicationContext.xml路径下,那么我们可以借助Spring的property-placeholder读取配置文件,然后注入Bean中.我们在程序中,可以根据Bean的Id,获取注入的值.这样我们就可以借助Spring来读取配置文件. 2.

SSH框架中Spring框架搭建的初步理解(一)

接手基于SSH框架的web项目已经一个月有余了.早有听说javaweb三大框架,第一次接触,先来说下感受. 我感觉SSH框架最明显的优点有如下: 采用MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现. 通过配置文件,就可以掌握整个系统各个部分之间的关系. 通过AOP,可以实现事务管理和日志管理. 其中Spring框架能使你通过最简单可行的方法来解决问题,这是非常高效的.但是它的搭建也略微复杂,尤其是对于我这样的新手来说,所以开此篇记录一下SPring框架的搭建: 创建web项目,导入SS

java框架篇---spring AOP 实现原理

什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合.当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力.也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系.例如日志功能.日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无

Java SSH框架系列:用户登录模块的设计与实现思路

时间 2014-01-19 16:14:54  CSDN博客原文  http://blog.csdn.net/nupt123456789/article/details/18504615 1.简介 用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问. 二.简单设计及实现 本程序是基于Java的SSH框架进行的. 1.数据库设计 我们应该设计一个用户表,其Userinfo表,对应的SQL语句为(

SSH框架中spring的原理

在ssh项目中,是有明确分工的,spring的作用就相当于将struts和hibernate连接起来,是将两个没有关系的框架的特性,方法,action都放在spring的配置文件中使他们建立关系.取他门各自所长.而这些做法他们自己不知道,他们是听命于spring调度的,他的的任务只是做好自己的事情.    这样做的好处就是任务结构分明,struts只管理显示与做什么,hibernate只关心怎么做,而spring就相当于领导,所以一切的类都要交给spring的工厂创建,这是一种良好的开发模式,体

Spring AOP应用实例demo

AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-OrientedPrograming,面向对象编程)的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合. OOP的问题,AOP的补充 当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力.也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系.例如日志功能.日志代码往往水平地散布在所有对象层次中,而与它所散布到的对