SpringAOP使日志输出与方法分离

本文介绍如何使用Spring AOP在方法调用前执行日志输出,通过创建目标对象、通知类及代理实现方法与日志的分离。

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

对方法进行日志输出是一种很常见的基本功能。传统的做法是把输出语句卸载方法体的内部,在调用该方法的时候,用输出语句输出信息来记录方法的执行。AOP可以分离与业务无关的代码,日志输出与方法都做些什么是无关的,其主要目的是记录方法被执行过。下面是一个Demo,利用SpringAOP使日志输出与方法分离,使得在调用模板方法之前执行日志输出。如图所示:

(1)创建Target类,作为被代理的目标对象。其中有一个execute()方法,现在使用AOP对execute()方法做日志输出。执行execute()方法之前,做日志输出。

<span style="font-size:14px;">package testDomain;

public class Target {

	public void  execute(String name){
		System.out.println("执行execute()方法: " + name); //输出信息
	}
}</span>
(2)创建LoggerExecute类,用于通知可以拦截目标对象的execute()方法,并执行日志输出。

<span style="font-size:14px;">package testDomain;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

import com.opensymphony.xwork2.interceptor.annotations.Before;

public class LoggerExecute implements MethodInterceptor {

	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
		before();
		invocation.proceed();
		return null;
	}
	
	public void before(){
		System.out.println("程序开始执行");
	}
}</span>

实现MethodInterceptor 接口,在调用目标对象的方法时,就可以实现在调用方法之前、调用方法过程中、调用方法之后对其进行控制。invocation.proceed()的proceed()是执行目标对象的execute()方法。

 (3)创建Manager类,在该类的方法中创建目标对象、创建代理、代理执行execute()方法。代码:

<span style="font-size:14px;">package testDomain;

import org.springframework.aop.framework.ProxyFactory;


public class Manager {

	public static void main(String[] args) {
		Target target =new Target();  //创建目标对象
		ProxyFactory di= new ProxyFactory();  //创建代理
		di.addAdvice(new LoggerExecute());
		di.setTarget(target);
		Target proxy =(Target)di.getProxy();
		proxy.execute("这是AOP的简单实现");
	}
}</span>
这里ProxyFactory可以创建代理,其中setTarget()方法可以设置目标对象,addAdvice()方法向这个目标添加了一个通知,这个通知会应用到目标对象的所有方法上去,随后通过调用ProxyFactory实例的GetProxy()方法获得一个代理——也就是目标对象AOP代理。当调用代理的Execute方法时。通知就被“应用了”(或者说被执行了)。
这样通过AOP来实现,可以将想似的代码统一起来,方便以后修改。同时AOP是可插拔式的,如果想去掉可以直接去掉即可。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值