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>
    



Spring AOPSpring框架中应用AOP(面向切面编程)思想的一种方式。它使用动态代理技术来实现。默认情况下,Spring会根据被代理对象是否实现接口来选择使用JDK动态代理还是CGLIB动态代理。当被代理对象没有实现任何接口时,Spring会选择CGLIB。当被代理对象实现了接口,Spring会选择JDK官方的代理技术。但是我们也可以通过配置的方式,让Spring强制使用CGLIB动态代理。 Spring AOP的配置方式有多种,包括XML模式、XML注解模式和纯注解模式。通过这些配置方式,我们可以将AOP的切面逻辑织入到我们的业务代码中,实现各种功能,比如事务管理等。 在Spring中,事务管理是AOP的一种常见应用Spring提供了多种事务管理器的实现,例如DataSourceTransactionManager和HibernateTransactionManager等。这些事务管理器实现了Spring的事务管理器核心接口,负责提供具体的事务实现策略。我们可以根据需要选择合适的事务管理器来管理数据库操作或其他事务。同时,Spring也提供了基于注解的声明式事务配置,通过在代码中使用注解来实现事务管理。 总之,Spring AOP可以应用在各种场景中,包括但不限于事务管理。通过AOP的切面编程思想,我们可以将一些横切逻辑代码(比如事务管理、日志记录等)与业务代码解耦,提高代码的可维护性和可扩展性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring AOP 应用](https://blog.youkuaiyun.com/weixin_44152160/article/details/125360176)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值