自定义注解-基于AOP

匿名 (未验证) 提交于 2019-12-02 23:39:01

依赖:

      <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"); }         }

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!