`
paddy.w
  • 浏览: 497753 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring利用注解进行多次拦截

阅读更多
        最近在用Spring AOP时遇到一个问题。一个切入点会触发两个通知,而切入点是通过注解进行标注的,而注解作为参数传递给通知方法。这样的情况下同时触发两个通知,Spring调用通知方法时传递的注解参数会出现类型错误的问题。

        先定义两个注解,Annotation1和Annotation2
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Annotation1 {
    String name();
}


@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Annotation2 {
    String name();
}


        定义接入点方法,joinPointTest
@Annotation1(name="annotation1")
@Annotation2(name="annotation2")
public void joinPointTest() throws Throwable {
    System.out.println("This is joinPointTest");
}



        定义通知方法adviseTest(一个方法即可说明问题,故省略另一个通知方法),并设为在接入点方法执行正常结束后调用
@AfterReturning("execution(* com.aop.test..*.*(..)) && @annotation(anno1)")
public void adviseTest(JoinPoint joinPoint, Annotation1 anno1) throws Throwable {
    System.out.println(anno1.name());
}


        按照以上的配置,在触发通知方法时可能出现传递给adviseTest方法的参数不匹配的错误,具体表现就是adviseTest需要Annotation1类型的参数,但实际上传递的是Annotation2。

        网上找了一下,没找到类似的问题,但是有其他的解决方案,修改后的adviseTest
@AfterReturning("execution(* com.aop.test..*.*(..)) && @annotation(com.aop.test.Annotation1)")
public void adviseTest(JoinPoint joinPoint) throws Throwable {
    Signature signature = joinPoint.getSignature();
    if (!(signature instanceof MethodSignature))
        throw new SignatureException("The Signature's real type is not MethodSignature but " + signature.getClass().getName());
    MethodSignature methodSignature = (MethodSignature) signature;
    Annotation1 anno1 = methodSignature.getMethod().getAnnotation(Annotation1.class);
    System.out.println(anno1.name());
}


        因为这里的接入点是方法,因此JoinPoint的getSignature方法返回的实际类型是MethodSignature,可以通过该类的getMethod获得实际的Method对象,进而获得指定的Annotation。
分享到:
评论

相关推荐

    spring security 参考手册中文版

    作为用户在Spring MVC测试中使用注释运行 108 12.2.4测试HTTP基本认证 109 12.3 SecurityMockMvcRequestBuilders 109 12.3.1测试基于表单的认证 109 12.3.2测试注销 110 12.4 SecurityMockMvcResultMatchers 110 ...

    springCloud

    Spring Cloud Bus 的一个核心思想是通过分布式的启动器对 Spring Boot 应用进行扩展,也可以用来建立一个或多个应用之间的通信频道。目前唯一实现的方式是用 AMQP 消息代理作为通道,但是相同的基本功能集(还有一些...

    Spring in Action(第2版)中文版

    11.3.4使用注释声明拦截器 11.4小结 第12章访问企业服务 12.1从jndi中获取对象 12.1.1使用传统的jndi 12.1.2注入jndi对象 12.1.3在spring2中注入jndi对象 12.2发送电子邮件 12.2.1配置邮件发送器 12.2.2...

    Spring in Action(第二版 中文高清版).part2

    11.3.4 使用注释声明拦截器 11.4 小结 第12章 访问企业服务 12.1 从JNDI中获取对象 12.1.1 使用传统的JNDI 12.1.2 注入JNDI对象 12.1.3 在Spring 2中注入JNDI对象 12.2 发送电子邮件 12.2.1 配置邮件发送...

    Spring in Action(第二版 中文高清版).part1

    11.3.4 使用注释声明拦截器 11.4 小结 第12章 访问企业服务 12.1 从JNDI中获取对象 12.1.1 使用传统的JNDI 12.1.2 注入JNDI对象 12.1.3 在Spring 2中注入JNDI对象 12.2 发送电子邮件 12.2.1 配置邮件发送...

    springboot知识点整理

    4.8.4 拦截器进行登录检查 81 4.8.5 实验要求(没按要求做,不想改了!) 82 4.8.6 CRUD-员工列表 83 4.8.7 CRUD-员工修改 86 4.8.8 CRUD-员工添加 87 4.8.9 CRUD-员工删除 88 4.9 错误处理原理&错误页面定制 90 ...

    lamp-cloud微服务脚手架

    基于Mybatis-plus-generator自定义了一套代码生成器, 通过配置数据库字段的注释,自动生成枚举类、数据字典注解、SaveDTO、UpdateDTO、表单验证规则注解、Swagger注解等。 16、定时任务调度器: 基于xxl-jobs进行了...

    代码生成器-可自定义模版-guns

    4. 对常用js插件进行二次封装,使js代码变得简洁,更加易维护,具体请见webapp/static/js/common文件夹内js代码。 5. 利用ehcache框架对经常调用的查询进行缓存,提升运行速度,具体请见ConstantFactory类中@...

    基于springboot的权限验证+源代码+文档说明

    基于`spring boot web`的权限拦截验证 ## 重要声明 * 本分支由`1.0.7`为第一个版本,此版本默认提供`guava`存储令牌的功能 * 根据`guava`的缓存特性,提供了`2`种缓存方案(`LoadingCache、Cache`) * 如果需要使用`...

    lamp-cloud微服务脚手架-其他

    基于Mybatis-plus-generator自定义了一套代码生成器, 通过配置数据库字段的注释,自动生成枚举类、数据字典注解、SaveDTO、UpdateDTO、表单验证规则注解、Swagger注解等。 16、定时任务调度器: 基于xxl-jobs进行了...

    java面试题

    就是说只需要创建一次,以后再程序中就可以调用多次。使用存储过程比单纯的SQL语句要快,可以用一个命令对象来调用存储过程。 索引优缺点? 答:索引可以提高对数据库中数据的检索,缺点是减慢了数据录入速度,同时...

    Guns后台管理系统-其他

    4、对常用js插件进行二次封装,使js代码变得简洁,更加易维护。 5、controller层采用map + warpper方式的返回结果,返回给前端更为灵活的数据,具体参见com.stylefeng.guns.modular.system.warpper包中具体类。 6、...

    基于ssm+shiro+redis+nginx tomcat服务器集群管理项目源码+项目说明.zip

    6.采用RESTFul的controller接口,展示RESTFul风格的API编写(shiro基于url的权限拦截与RESTFul API兼容性不好,后期可能会改写shiro以匹配RESTFul) 7.Junit单元测试,展示如何正确的使用Junit单元测试验证自己...

    asp.net知识库

    在ASP.Net中两种利用CSS实现多界面的方法 如何在客户端调用服务端代码 页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置? 如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值...

    Dubbo服务框架-其他

    Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring 框架无缝集成。Dubbo主要核心部件:Remoting:网络通信框架,实现了sync-over-async和...

Global site tag (gtag.js) - Google Analytics