自定义注解-基于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");
}

}

原文地址:https://www.cnblogs.com/lshan/p/10999395.html

时间: 2024-11-09 05:06:30

自定义注解-基于AOP的相关文章

通过自定义注解与aop统一存储操作记录

模块开发完成后,接到通知需要添加操作记录功能,看着那一堆接口,如果一个方法一个方法的加,那真是太麻烦了.为了偷懒,就百度了一下,发现可以通过自定义注解和aop的形式来统一添加操作记录,只需要在每个方法上面添加自定义的注解就可以了.我在这里用的是springboot2.0以及jpa,废话不多说,直接上代码~ 自定义注解serverLog import java.lang.annotation.ElementType; import java.lang.annotation.Retention; i

SpringBoot利用自定义注解实现AOP

SpringBoot利用自定义注解实现AOP java 本文主要讲解利用SpringBoot的自定义注解来实现AOP思想. 在开始所有的操作之前,需要导入aop坐标: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 如何自定义注解? 实际上注解本

基于 自定义注解 和 aop 实现使用memcache 对数据库的缓存 示例

好久没更新blog了,在新公司打拼了两个月,每天都从早忙到晚,学到了很多东西,但是没有时间来更新blog了.... 下面开始讲解这次的主题 公司老大让我研究 ocs 就是阿里云的 开放缓存服务 点击打开链接 其实就是一个memcache的服务 memchech 就是用内存来存放 key -value  在一些情况下就不必频繁的访问 数据库了(其实就是个map) 如何在常用的Dao中方便的使用这个map呢,我首先想到了 aop,然后又想到了自定义注解,那么就开始干吧.... aop动态代理要使用的

自定义注解实现AOP日志记录

自定义注解 package com.annotation; import java.lang.annotation.*; /** *自定义注解 拦截Controller */ @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SystemLog { String module() default ""

使用自定义注解和AOP管理shiro权限

一.场景 在使用shiro框架的时候,遇到了这样的需求:本系统有多个用户,每个用户分配不同角色,每个角色的权限也不一致.比如A用户拥有新闻列表的增删改查权限,而B用户只有查看新闻列表的权限,而没有删除.新增.修改的权限,此时有3种方案:1.不给B用户分配删除.新增.修改的菜单,这样用户就无法点击从而无法操作.2.给B用户分配菜单,后台中进行增删改查操作时都要进行权限验证.  3.给B用户分配菜单并且进行操作的时候校验权限. 显然,第2.3种方案比第1中方案要安全.本系统中使用第二种方案. 二.为

参数上使用自定义注解在aop中无法获取到该参数

https://ask.csdn.net/questions/769477 /** * 环绕增强,验证权限 * @param joinPoint 目标对象 * @param authCheck 自定义的注解,Around必须这样写,否则自定义的注解无法传入 * */ @Around("pointAll() && @annotation(authCheck)") public Object before(ProceedingJoinPoint joinPoint, Aut

使用Spring Aop自定义注解实现自动记录日志

百度加自己琢磨,以下亲测有效,所以写下来记录,也方便自己回顾浏览加深印象之类,有什么问题可以评论一起解决,不完整之处也请大佬指正,一起进步哈哈(1)首先配置文件: <!-- 声明自动为spring容器中配置@aspectj切面的bean创建代理 ,织入切面 --> <aop:aspectj-autoproxy /> <!-- 开启注解扫描 --> <context:component-scan base-package="com.ky.zhjd.**&q

spring AOP + 自定义注解实现权限控制小例子

今天看了一下黑马程序员的视频,上面讲到一个使用spring AOP + 自定义注解的方式来实现权限控制的一个小例子,个人觉得还是可以借鉴,整理出来与大家分享. 需求:service层有一些方法,这些方法需要不同的权限才能访问. 实现方案:自定义一个PrivilegeInfo的注解,使用这个注解为service层中的方法进行权限配置,在aop中根据PrivilegeInfo注解的值,判断用户是否拥有访问目标方法的权限,有则访问目标方法,没有则给出提示. 关键技术:自定义注解及注解解析,spring

spring AOP自定义注解方式实现日志管理

转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在applicationContext-mvc.xml中要添加的 <mvc:annotation-driven />     <!-- 激活组件扫描功能,在包com.gcx及其子包下面自动扫描通过注解配置的组件 -->     <conte