Spring AOP 的应用

本文介绍了一种利用面向切面编程(AOP)进行日志记录的方法,通过具体实例展示了如何在应用程序中实现方法调用前后的日志记录,包括参数、返回值及异常处理。

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

不说了,有人比我写的好

查看链接:http://blog.youkuaiyun.com/moreevan/article/details/11977115

我觉得主要的还是要清楚应用场景:

Authentication 权限

Caching 缓存

Context passing 内容传递

Error handling 错误处理

Lazy loading 懒加载

Debugging  调试

logging, tracing, profiling and monitoring 记录跟踪 优化 校准

Performance optimization 性能优化

Persistence  持久化

Resource pooling 资源池

Synchronization 同步

Transactions 事务




写一个自己的例子吧

这是一个使用AOP记录日志信息的例子:

下面是日志类:

package com.webService.util;

import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class LogNote {

   private final Logger logger = Logger.getLogger(LogNote.class);
    
    //有参无返回值的方法
    public void logArg(JoinPoint point) {
        //此方法返回的是一个数组,数组中包括request以及ActionCofig等类对象
        Object[] args = point.getArgs();
        System.out.println("目标参数列表:");
        if (args != null) {
            for (Object obj : args) {
                System.out.println(obj + ",");
            }
            System.out.println();
        }
    }

    //有参并有返回值的方法
    public void logArgAndReturn(JoinPoint point, Object returnObj) {
        Object[] args = point.getArgs();
        StringBuffer paras=new StringBuffer();
        paras.append("\nPARAMETERS :\n");
        if (args != null) {
            for (Object obj : args) {
            	try {
            		if (obj instanceof java.lang.String) {
            			paras.append("\t"+obj+"\n");
            		}else {
            			paras.append("\t"+new ReflectionToStringBuilder(obj,ToStringStyle.SHORT_PREFIX_STYLE).toString() + "\n");
					}
				} catch (Exception e) {
        			paras.append("\t"+obj+"\n");
				}
            }
            paras.append("RETURN : "+returnObj);
            logger.info(paras.toString());
        }
    }
    
    public Object logAround(ProceedingJoinPoint pjp) throws Throwable {
        String className = pjp.getTarget().getClass().getSimpleName();
        String methodName = pjp.getSignature().getName();
        StringBuffer sb = new StringBuffer();
        sb.append(" className: " + className);
        sb.append(" methodName: " + methodName);
        logger.info(sb.toString());
        Object obj = pjp.proceed();
        return obj;
    }
    
   public void  logException(Throwable e){
       logger.warn(getClass(), e);
       e.printStackTrace();
   }
}

applicationContext.xml 配置文件

<!-- 日志记录 -->
	<bean id="lognote" class="com.webService.util.LogNote"></bean>
	 <aop:config>
        <!-- 切入点 -->
        <aop:pointcut expression="execution(* com.webService.servers.EdbImple.*(..))" id="edbPointcut" />
        <!-- 切面: 将哪个对象中的哪个方法,织入到哪个切入点 -->
        <aop:aspect id="cut" ref="lognote">
            <aop:after-returning method="logArgAndReturn" returning="returnObj" pointcut-ref="edbPointcut"/>
            <aop:around method="logAround" pointcut-ref="edbPointcut" />
            <aop:after-throwing method="logException" pointcut-ref="edbPointcut" throwing="e"/>  
        </aop:aspect>
    </aop:config>
    



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值