使用@aspject进行aop增强处理,示例是类似于一个日志记录功能。
1.demo-web新增
- Log
package com.company.aspectj; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 注解生命周期-运行时 * 注解目标:方法 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Log { String value() default ""; }
- LogAspejctj
package com.company.aspectj; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Aspect public class LogAspectj { private static final Logger LOGGER = LoggerFactory.getLogger(LogAspectj.class); @AfterReturning(value = "@annotation(com.company.aspectj.Log)",returning = "ret") public void LogAfterReturning(JoinPoint joinPoint,Object ret){ Object[] args = joinPoint.getArgs(); LOGGER.info("方法入参:{}",args); LOGGER.info("返回值:{}",ret); } }
2.配置
<!--@aspectj启动,子类代理--> <aop:aspectj-autoproxy proxy-target-class="true"/> <!--将定义aspectj扫入spring bean容器里(二选一)--> <context:component-scan base-package="com.company.aspectj"> <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/> </context:component-scan> <!--<bean id="logAspectj" class="com.company.aspectj.LogAspectj"/>-->
3.实例测试
- 将Log注解值UserController中qryUserById方法上
@RequestMapping("qryUserById") @ResponseBody @Log public User qryUserById(Long id) throws DemoException{ if(id == null){ throw new DemoException("id为空"); } return userService.qryUserById(id); }
- 地址栏=>http://localhost:8080/demo-web/user/qryUserById.do?id=1,console输出