zoukankan      html  css  js  c++  java
  • 自定义注解-基于AOP

    依赖:

          <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
            </dependency>

    注解1(不带参数):

    /**
     * sea test 使用 AOP 自定义注解(不带参数)
     * @author sea
     *
     */
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface SeaAnnotion {  
    } 

    注解2(带参数):

    /**
     * sea test 使用 AOP 自定义注解(带参数)
     * @author sea
     *
     */
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface SeaAnnotion2 {  
       
        String title() default "";
    }

    配置切片:

    package com.sea.test.annotation.aop;
    
    import java.lang.reflect.Method;
    import java.util.Date;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.Signature;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class SeaAnnotionAOPs {
    
        private static Logger logger = LoggerFactory.getLogger(SeaAnnotionAOPs.class);
    
    
    //    @Around("execution(* com.sea.web.controller.UserController.*(..))") //com.icil.esolution.service.impl
    //    @Around("execution(* com.sea.test.pojo.*.*(..))&&@annotation(seaAnnotion)") 
        @Around("@annotation(seaAnnotion)")//作用到注释@seaAnnotion标记的方法上
        public Object handleSeaAnnotionAOPMethod(ProceedingJoinPoint pjp,SeaAnnotion  seaAnnotion) throws Throwable {
            System.err.println("7777777777777777777777777");
            System.err.println("7777777777777777777777777");
            System.err.println("7777777777777777777777777");
            long start = new Date().getTime();
            Object object = pjp.proceed(); // *********************************************
            
            System.err.println("7777777777777777777777777");
            System.err.println("7777777777777777777777777");
            System.err.println("7777777777777777777777777");
            String costTime = (new Date().getTime() - start) + "";
            String methodName = pjp.getSignature().getName();
            logger.info("*************** Run the  method --> {} total  cost  time  is {}  ms********************",
                    methodName, costTime);
    
            return object;
        }
        
        
        /**
         * 
         * @param pjp
         * @param seaAnnotion2 :带参数的注解
         * @return
         * @throws Throwable
         */
        @Around("@annotation(seaAnnotion2)")//作用到注释@seaAnnotion2标记的方法上
        public Object handleSeaAnnotionAOPMethod(ProceedingJoinPoint joinPoint,SeaAnnotion2  seaAnnotion2) throws Throwable {
            
            //获取注解属性值
            String title = seaAnnotion2.title();
            System.err.println("&&&&&&&&& title is "+title+" &&&&&&&&&&&&&&&&&");
            Object object = joinPoint.proceed(); // *********************************************
            
        
            //获取方法名
            String methodName = joinPoint.getSignature().getName();
            MethodSignature signature =  (MethodSignature)joinPoint.getSignature();
             //获取方法
             Method method = joinPoint.getTarget().getClass().getMethod(methodName, signature.getParameterTypes());
             
            return object;
        }
    
        
        
        
        
        private Method getMethod(ProceedingJoinPoint joinPoint) {
            //获取参数的类型
            Method method = null;
            try {
                Signature signature = joinPoint.getSignature();
                MethodSignature msig = null;
                if (!(signature instanceof MethodSignature)) {
                    throw new IllegalArgumentException("该注解只能用于方法");
                }
                msig = (MethodSignature) signature;
                method = joinPoint.getTarget().getClass().getMethod(msig.getName(), msig.getParameterTypes());
            } catch (NoSuchMethodException e) {
                logger.error("annotation no sucheMehtod", e);
            } catch (SecurityException e) {
                logger.error("annotation SecurityException", e);
            }
            return method;
        }
    
    
    
    }

    使用注解:

    @Component
    public class TestnonationClass {
    
        @SeaAnnotion
        public void  get() {
            System.err.println("hhahhahah");
            
            
        }
        
        
        
        @SeaAnnotion2(title="参数 title")
        public void  get2() {
            System.err.println("hhahhahah");
            
            
        }
        
        
    }

    test case:

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = DemoApplication.class)
    public class AnnotionAOPTest {
        
    
    /**
     *注入Test的方法:否则容器加载不到,注解无效    
     */
    @Autowired
     private TestnonationClass testnonationClass;
     
    
    /**
     * 不带参数
     * @SeaAnnotion
     * @throws Exception
     */
     @Test
    public void testAOPAonotionNoparam() throws Exception {
         testnonationClass.get();
         System.err.println("hhh");
    }
    
     /**
      * 带参数
      * @throws Exception
       @SeaAnnotion2(title="sea  test aonotion with param")
      */
     @Test
    public void testAOPAonotionWithparam() throws Exception {
         testnonationClass.get2();
         System.err.println("hhh");
    }
     
     
     
     
    }
  • 相关阅读:
    JAVA查询树结构数据(省市区)使用hutool工具实现
    定时器
    工作队列
    中断类型
    通过风扇FG脚检测风扇转速
    共享中断
    Linux中断信号的查看
    使用Alibaba Cloud Linux 2系统开突发型实例遇到宿主机一直超分案例
    React学习(三)----- 组件的生命周期
    React学习(二)----- 面向组件编程
  • 原文地址:https://www.cnblogs.com/lshan/p/10999395.html
Copyright © 2011-2022 走看看