java 自定义注解 aop 使用
java 自定义注解简单使用
一 、 java 元注解
- Target
- Retention
- Documented
- Inherited
关于 java 元注解解释 https://www.cnblogs.com/kingsonfu/p/10634174.html
二、 编写自定义注解
@Retention(RetentionPolicy.RUNTIME) // 在runtime 期间生效
@Target({ElementType.METHOD,ElementType.TYPE}) // 目标 作用域 method
public @interface AnnoationCeshi { public String ceshiValue() default "wxx"; }
default 默认值 为 “”wxx" 非必填
三、 编写切面
@Component @Aspect public class AnnoationCeshiFine { // @annotation 表示 使用该注解的方法 @Around(value = "@annotation(AnnoationCeshi)") public Object aroundMethod(ProceedingJoinPoint jp) throws Throwable { // String module = getModule(jp); // 逻辑代码 // System.out.printf("**********" + module); return jp.proceed(); } }
@Component 等价于 @Controller @Service ... spring 扫描并被 spring 容器管理
@Aspect 作用是把当前类标识为一个切面供容器读取
AnnoationCeshi 为自己定义的 注解
只要加了 @AnnocationCeshi 注解的 方法 都会执行 上述代码
--------------------------------------------------------------------------------------------我是分割线------------------------------------------------------------------------------------------------
// 定义切点 // @poincut execution 表达式 //exxcution( * com.xy.xywx.controller.CeshiController.*(..)) CeshiController 类中所有方法 public 可省略 @Pointcut("execution(public * com.xy.xywx.controller..*.*(..))") public void poincut(){}
@poincut 定义切面 , 里面为 excution 表达式 。 其中 excution 表达式中 public 可省略不写 第一个 * 表示 controller 包中的所有类,第二个 * 表示 类中的所有方法, .. 表示 不限参数
// @Before(value = "poincut()") //通知前增强
// @AfterReturning(value = "poincut()") // 通知后 增强
// @AfterThrowing(value = "poincut()") // 异常 增强
// @After(value = "poincut()") // final 增强
// @Around(value = "poincut()")
四、具体使用
@Around(value = "poincut()") public Object aroundMethod(ProceedingJoinPoint jp) throws Throwable { System.out.println("-----"); Object[] args = jp.getArgs(); Arrays.stream(args).forEach(x -> System.out.println(x)); return jp.proceed(); }
return jp.proceed() 重点