Aop面向切面aspect,@Around @Before @After三个注解的区别

区别:@Before(前置通知Before advice)是在所拦截方法执行之前执行一段逻辑。 @After 后通知(After advice是在所拦截方法执行之后执行一段逻辑。 @Around 环绕通知(Around advice) 是可以同时在所拦截方法的前后执行一段逻辑,用这个注解的方法入参传的是ProceedingJionPoint pjp,可以决定当前线程能否进入核心方法中——通过调用pjp.proceed();

demo: 下面可将 @Around(“loggerPointCut()”)改为@Before(“loggerPointCut()”)或@After(“loggerPointCut()”) 在需要通知的方法上加上@SysLogger(“rocketmq测试咯”) controller里: @GetMapping("/produce") @SysLogger(“rocketmq测试咯”) public MelotResult produce(@RequestParam(name=“topic”)String topic, @RequestParam(“tag”)String tag, @RequestParam(“keys”)String keys, @RequestParam(“msg”)String msg ){ log.info(“topic=={},tag=={},keys=={},msg=={},delayTime=={}”,topic,tag,keys,msg); boolean sent = producerService.sent(topic, tag, keys, msg, null); return new MelotResult(sent); }

通知方法: SysLogger.java: @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SysLogger { String value() default “”; }

SysLoggerFilter.java @Component @Aspect public class SysLoggerFilter { private static Logger log = LoggerFactory.getLogger(SysLoggerFilter.class); @Pointcut("@annotation(com.forezp.annotation.SysLogger)") public void loggerPointCut() {

}

@Around("loggerPointCut()")
public Object saveSysLog(ProceedingJoinPoint joinPoint) throws Throwable {
    ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
            .getRequestAttributes();
    HttpServletRequest request = requestAttributes.getRequest();
    String loginUserId = request.getHeader("loginUserId");
    MelotResult<Object> rs = new MelotResult<>();
    if(StringUtils.isBlank(loginUserId)){
        rs.setSuccess(false);
        rs.setMsg("还没登录系统");
        return rs;

    }
    return joinPoint.proceed();





}
经验分享 程序员 微信小程序 职场和发展