注解:
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
网友评论