zoukankan      html  css  js  c++  java
  • 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(环绕通知)在目标方法执行之前和执行之后都会执行,可以设定目标方法是否执行

      

  • 相关阅读:
    用GDB调试程序(一)
    关于“鸡脚神”的看法
    Oracle 经典SQL 专为笔试准备
    怎样设计接口?
    myeclipse6.0下载及注冊码
    VB连接Mysql数据库
    开源html5_kiwijs_helloworld
    server宕机监控、检測、报警程序(139绑定手机短信报警)monitor_down.sh
    js实现自己定义鼠标右键-------Day45
    C/C++程序猿必须熟练应用的开源项目
  • 原文地址:https://www.cnblogs.com/dblog/p/12158119.html
Copyright © 2011-2022 走看看