java-自定义注解

概述:本章简述自定义注解及实现,写完会对IOC与AOP有深刻的理解。感觉注解不再神秘。

1:理解:从简单的应用层面来说,分2步。

  第一步:定义一个注解,这个注解中可以有不同的属性。可以理解是我要带的参数。

  第二步:写一个拦截,即AOP。拦截请求,然后判断是否存在这个注解,如果存在我们可以写我们的逻辑了。

  总结:举例我们要执行一个action前需要获取这个用户的登录信息。比较笨的方法是写一个获取登录信息的方法,然后每个action代码的最前面执行这个方法。

     而我们可以使用自定义注解完成这个事,第一步就是方法的入口。第二步就是方法的实现。

2:实现。

  第一步:定义注解入口。

@Target(ElementType.METHOD)    //作用域:类,方法等
@Retention(RetentionPolicy.RUNTIME)    //生命周期:程序在运行时有效
@Documented
public @interface Test {

    String value() default "";    //可以传value值,不传默认是""
    
}

  第二步:定义AOP。

@Aspect    //切面类
@Component
public class TestAop {
    
    /**
     * 定义切点
     * @param test
     * within(org.springframework.web.bind.annotation.RestController *) 表示拦截所有引入RestController注解的
     * @annotation(test) 表示包含 test注解的
     * execution(* *(..)) 表示可以有任意返回值,任意路径,任意参数
     */
    @Pointcut("within(org.springframework.web.bind.annotation.RestController *) && "
            + "@annotation(test) && execution(* *(..))")
    private void pointCut(Test test) {

    }
    
    /**
     * before拦截,一般用于身份验证,数据拦截等
     */
    @Before("pointCut(test)")
    private void before(JoinPoint joinPoint,Test test) {
        //具体的处理逻辑
        
        String value = test.value();  //可以获取注解传入的值
        
        Object[] args = joinPoint.getArgs(); //获取方法传入的信息
        for (Object obj : args) {
            //可以获取HttpServletRequest
            if(obj instanceof HttpServletRequest) {
                HttpServletRequest req = (HttpServletRequest) obj;
            }
        }
        
    }
    
}

  @After

  引入这个注解的方法执行之后要做的处理。
  @Around

  引入这个注解的方法执行中做的处理,比如可以做日志处理。

3:补充

  3.1 AOP的5种通知及区别

    before(前置通知)在目标方法调用之前执行;

    afterReturning(后置通知)在目标方法调用之后执行,一旦目标方法产生异常不会执行

    after(最终通知)在目标调用方法之后执行,无论目标方法是否产生异常,都会执行;

    afterThrowing(异常通知)在目标方法产生异常时执行;

    around(环绕通知)在目标方法执行之前和执行之后都会执行,可以设定目标方法是否执行

  

posted @ 2020-01-07 11:26  bug修复中  阅读(422)  评论(0编辑  收藏  举报