Springboot使用注解实现Aop不生效

发布于 2022-09-12 03:03:18 字数 2099 浏览 31 评论 0

想着用redis来实现一个文章阅读数的增加功能,参考网上使用aop来增加阅读数,但是怎么都不能进入通知

切入点注解   
@Target({ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface HyperLogInc {

    String description() default "";
}
切面实现
@Aspect
@Configuration
public class HyperLogAspect {

    @Autowired
    private RedisUtils redisUtils;

    /**
     * @desc aop切入点
     */
    @Pointcut("@annotation(space.springboot.community.aspect.HyperLogInc)")
    public void pointCut(){
    }

    /**
     * @desc 切入点后执行的内容,即通知,around,即切入点的方法执行前后执行通知,用joinPoint.proceed()来控制切入点方法的执行
     * @return
     */
    @Around("pointCut()")
    public Object around(ProceedingJoinPoint joinPoint){
        System.out.printf("aop around start");
        Object[] args = joinPoint.getArgs();
        Object questionId = args[0];
        Object obj = null;
        try {
            String ip = IPUtils.getIpAddr();
            String redisKey = "questionId_" + questionId;
            redisUtils.hAdd(redisKey,ip);
            obj = joinPoint.proceed();
            System.out.printf("redisKey:" + redisKey);
            System.out.printf(obj.toString());
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return obj;
    }
}

在service中调用

@Component
public class QuestionService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private QuestionMapper questionMapper;

    @HyperLogInc(description = "增加阅读数")
    public QuestionDto findQuestionById(Integer id) {
        Question question = questionMapper.findQuestionById(id);
        if (question == null) {
            throw new CustomizeException(CustomizeErrorCode.QUESTION_NOT_FOUND);
        }
        QuestionDto questionDto = new QuestionDto();
        User user = userMapper.findById(question.getCreator());
        BeanUtils.copyProperties(question, questionDto);
        questionDto.setUser(user);
        return questionDto;
    }
}

不论我是放在controller还是放在service,都没有进到这个aspect里面去,求大哥们解答

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

不再让梦枯萎 2022-09-19 03:03:18

感谢楼上各位大哥,突然发现是我太煞笔了,我是用idea新建了一个apsect文件,这个文件根本不是一个类,他不会被编译成class,即使我把public Aspect HyperLogAspect改成public class HyperLogAspect也不会被编译

三人与歌 2022-09-19 03:03:18

HyperLogAspect类中@Around参数的值改成

@Around(value = "@annotation(space.springboot.community.aspect.HyperLogInc)")

这样就会去拦截你加了@HyperLogInc注解的方法了。

傲影 2022-09-19 03:03:18

修改为如下试下

@Around("@annotation(pace.springboot.community.aspect.HyperLogInc) && @annotation(
hyperLogInc)")

即增加了@annotation

挖个坑埋了你 2022-09-19 03:03:18

Aop机制的实现是Spring通过被代理类所实现的接口来自动创建一个动态代理,所以被代理类需要实现一个接口。
没记错的话应该是这样。:)

仲春光 2022-09-19 03:03:18

我淦。我也是用的.aj文件 没改成.java 好蠢哦

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文