spring mvc 基于aop日志管理

本文通过Spring AOP技术实现日志管理功能,详细介绍了AOP的强大应用,包括日志记录、性能统计、安全控制、事务处理、异常处理等,并通过XML配置方式展示如何在Spring框架下实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近忙于面试换工作,不论是学习还是工作似乎都忽略了spring另外的一个强大之处:AOP;当被面试问道如何基于AOP做出一个单点登录的时候顿时有点傻眼。下来之后做了一番学习。本文以日志管理为例,说明AOP的强大之处。

首先,说明一下AOP的强大应用。

可以简单实现强大的功能:日志记录,性能统计,安全控制,事物处理,异常处理等。

AOP是Aspect Oriented Programming ,意识是面向切面变成,实际是GoF设计模式的延续。

Aspect:切面,在AOP中可以采用@Aspect注解来实现切面

Joinpoint:连接点,在Spring AOP中一个连接点代表一个方法的执行

Advice:通知,在切面(Aspect)的某个特定的连接点(Joinpoint)上执行的动作。通知有几种类型:

               around:方法执行前后通知;

               before:方法执行前通知;

               after:方法执行后通知;

Pointcut:定义一个或一组方法,当是在这些方法时可以产生通知。

@AspectJ风格的AOP配置

Spring AOP配置有两种风格:

     XML风格 = 采用声明形式实现Spring AOP 

    AspectJ风格 = 采用注解形式实现Spring AOP

注:本文采用XML风格

好了,开始我们的code。

首先搭建spring的配置在http://blog.youkuaiyun.com/upxiaofeng/article/details/38435531一文中阐述。

补充的是aop的xml配置:applicationContext.xml

<aop:aspectj-autoproxy />  
 <!-- 启用日志类 -->
    <bean id="mylog" class="controller.log.MyLog"></bean>
    <!-- AOP配置  proxy-target-class需要设置为true-->
 <aop:config proxy-target-class="true">
     <!-- expression 设置切入一个或者一组方法 -->
  <aop:pointcut id="log" expression="execution(* service.*.*(..))" />
  <!-- aspect 设置切面 -->
  <aop:aspect id="myLog" ref="mylog">
      <!-- before 方法执行之前通知,method:通知的方法 -->
   <aop:before pointcut-ref="log" method="before"/>
   <!-- after 方法执行之后通知,method:通知的方法 -->
   <aop:after pointcut-ref="log" method="after"/>
  </aop:aspect>
 </aop:config>

MyLog的代码:

package controller.log;

import org.aspectj.lang.JoinPoint;

public class MyLog {
	// 在类里面写方法,方法名诗可以任意的。此处我用标准的before和after来表示
	// 此处的JoinPoint类可以获取,action所有的相关配置信息和request等内置对象。
	public void before(JoinPoint joinpoint) {
		// 此方法返回的是一个数组,数组中包括request以及ActionCofig等类对象
		Object[] object = joinpoint.getArgs();
		for(Object o:object){
			System.out.println(o);
		}
		System.out.println(joinpoint.getClass().getMethods());
		System.out.println(joinpoint.getTarget());
		System.out.println("被拦截方法调用之前调用此方法,输出此语句");
	}

	public void after(JoinPoint joinpoint) {
		System.out.println("被拦截方法调用之后调用此方法,输出此语句");
	}

}

在执行service包里面的所有类的所有方法的时候会进入mylog中。

注:处理的时候可能会报错,是因为包重复原因是Spring中的cglib-nodep-2.1.3.jar与Hibernate中的cglib-2.2.jar相冲突!
我的解决方法是 删除cglib即可

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值