Spring boot切面不生效问题

2021-05-18  本文已影响0人  机灵鬼鬼

注解:

package com.test.aspdemo;

import java.lang.annotation.*;

/**
 * author:lss
 * @author ls
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Say {
  public String value() default "";
}

切面类:

(注意切面类一定要加上@Component注解,否则会不生效)原因是:底层会使用ApplicationContextUtil.getBean(Service.class); 这一行代码是向spring容器拿的实例,实际上是代理类,如果不用@Component注解,那么切面是不会进入容器的。

package com.test.aspdemo;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SayAspect {
    @Pointcut("@annotation(com.test.aspdemo.Say)")
    public void sayPointCut(){
        /**
         * 此方法体不会执行
         */
       // System.out.println("我要先说句话");
    }
    @Before("sayPointCut()")
    public void startForDinner(){
        System.out.println("我们该吃饭了");
    }

}

调用类:

package com.test.aspdemo;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SayAspect {
    @Pointcut("@annotation(com.test.aspdemo.Say)")
    public void sayPointCut(){
        /**
         * 此方法体不会执行
         */
       // System.out.println("我要先说句话");
    }
    @Before("sayPointCut()")
    public void startForDinner(){
        System.out.println("我们该吃饭了");
    }

}

执行结果:


image.png
上一篇 下一篇

猜你喜欢

热点阅读