Spring 自定义注解+AOP日志打印(XML+注解方式)

本文详细介绍了如何通过XML配置和注解方式在Spring框架下应用AOP,包括添加AspectJ依赖、自定义注解、切点表达式、切面类实现、ApplicationContext配置、web.xml设置以及使用注解的AOP实践。重点展示了三种获取请求的方法和自动代理配置选项。

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

一、XML方式

1、pom.xml

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>3.2.9.RELEASE</version>
</dependency>
// 或
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.10</version>
</dependency>
// 或
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.8.13</version>
</dependency>

2、自定义注解类

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface BusiLog {
	String busCode();
	String desc() default "";
}

3、定义aop类

public class BusiLogAspect {

    //@Autowired
	//HttpServletRequest request;

	public void doBefore(JoinPoint pjp) {
        String sessionId = null;
        try {
			MethodSignature signature = (MethodSignature)pjp.getSignature();
			BusiLog annotation = signature.getMethod().getAnnotation(BusiLog.class);
			if (null == annotation) {
				return;
			}
			ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
			if (null == attributes || null == attributes.getRequest()) {
				return;
			}
            // 获取会话ID
            HttpServletRequest request = attributes.getRequest();
			sessionId= request.getHeader("sessionId");
            // 获取请求入参
			JSONObject req = null;
			Object[] args = pjp.getArgs();
			if (args != null) {
				for(Object arg : args){
					if (arg instanceof String) {
						String reqStr = (String)arg;
						if (StringUtils.isNotBlank(reqStr)) {
							req = JSON.parseObject(reqStr);
						}
					}
					/*else if (arg instanceof HttpServletRequest) {
						request = (HttpServletRequest)arg;
						sessionId = request.getHeader("sessionId");
					}*/
				}
			}
			// 打印日志
			if (null != req) {
				printLog(sessionId, annotation.busCode(), req);
                /*****省略*****/
			}	
		} catch (Exception e) {
			logger.error(sessionId, e);
		}
	}
}

三种获取Request的方法。

4、applicationContext.xml配置

<bean id="busiLogAspect" class="cn.aspect.BusiLogAspect"/>
<aop:config>
	<aop:pointcut expression="@annotation(cn.annotion.BusiLog)" id="busiLogPointCut" />
	<aop:aspect id="logAspect" ref="busiLogAspect">
		<aop:before method="doBefore" pointcut-ref="busiLogPointCut" />
	</aop:aspect>
</aop:config>
<aop:aspectj-autoproxy/>
<!-- <aop:aspectj-autoproxy proxy-target-class="true"/> -->
<!-- <aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="false"/> -->

aop:aspectj-autoproxy:声明自动为Spring容器中配置@aspectj切面的bean创建代理。
proxy-target-class="true":默认false:JDK代理,true:强制使用CGLIB代理。默认情况下,目标类是接口或实现了接口,就会使用JDK动态代理(基于接口),否则spring将自动使用CGLIB代理(基于继承)。
expose-proxy:用来解决对象内部this调用无法被切面增强的问题。(this.y() --> 1、((A)AopContext.currentProxy()).y(),2、expose-proxy=true)。

5、web.xml

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener>

如果web.xml不配置这个监听,RequestContextHolder.getRequestAttributes()就取不到request信息。

6、使用

@RestController
public class TestController {
	@BusiLog
    @RequestMapping("/hello")
    public String hello(HttpServletRequest request, @RequestBody String param){
		return "hello " + param;
    }
}

二、注解方式

1、pom.xml

     同上

2、自定义注解类

     同上

3、定义aop类

@Aspect
@Component
public class BusiLogAspect {

    @Pointcut("@annotation(cn.annotion.BusiLog)")
	public void auditAspect(){
	}

    @Before("auditAspect()")
	public void doBefore(JoinPoint pjp) {
        /*****内容同上,省略*****/
	}
}

4、web.xml

     同上

5、使用

     同上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值