最近在用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注解的bean时,有几种常见的方法: 1. **ThreadLocal**:Spring提供了一种名为`ThreadLocalTargetSource`的特殊`TargetSource`实现,可以将bean实例绑定到当前线程。这样,每个线程都有其...
最后,需要注意的是,由于“将流多次运用”的描述,这里可能涉及到流的处理。在处理HTTP请求时,特别是涉及文件上传时,确保正确地管理和关闭输入/输出流是非常重要的,以避免资源泄露。 总结起来,这个压缩包提供...
本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与Spring及Struts2的集成。 首先,让我们来看一下“一对多”关系。在数据库设计中,一对多关系很常见,比如一个用户可以有多个订单。在Ibatis中,...
它提供了许多功能,包括登录表单、记住我功能、多身份验证器、基于注解的安全配置、CSRF 防护、OAuth2 客户端和服务端支持等。Spring Security 的目标是使开发人员能够快速地为应用程序添加安全功能,同时提供足够的...
5.0.4.RELEASE是Spring框架的一个版本号,代表着这个版本在发布时经过了多次迭代和修复,旨在提供稳定性和性能的提升。 在Spring框架的Web模块中,主要包含以下几个关键组件和功能: 1. **DispatcherServlet**:这...
`@Aspect`注解用于定义一个切面,其中可以包含多个通知方法。`@Before`、`@After`、`@AfterReturning`、`@AfterThrowing`和`@Around`分别表示前置通知、后置通知、返回后通知、异常后通知和环绕通知,这些注解标记的...
在这个场景中,"java注解方式实现拦截接口重复提交"是为了解决一个常见的问题:如何避免用户在短时间内多次调用同一接口,导致服务器处理重复请求,可能引发资源浪费或数据不一致。 首先,我们需要定义一个自定义...
在Spring中可以通过在XML配置文件中添加context命名空间并声明注解驱动元素,或者使用Java配置类上的注解(如@ComponentScan)来启动注解装配。 27、@Component,@Controller,@Repository,@Service有何区别? 这些...
标题“Spring全包”指的是Spring框架的完整集合,包含了该框架的所有组件和功能。...在实际开发中,根据项目需求,可以选择合适版本的Spring全包进行导入,以利用其强大的功能来构建高效、灵活的企业级应用。
Spring Cloud Bus 的一个核心思想是通过分布式的启动器对 Spring Boot 应用进行扩展,也可以用来建立一个或多个应用之间的通信频道。目前唯一实现的方式是用 AMQP 消息代理作为通道,但是相同的基本功能集(还有一些...
4. **编写业务逻辑**:定义Java类作为Spring的bean,利用注解或XML配置进行依赖注入。 5. **创建Spring启动类**:如果开发Web应用,创建一个启动类,通过`WebApplicationContext`加载配置。 6. **测试**:编写JUnit...
1. 性能优化:Spring 5.3.29版本对多个组件进行了性能优化,例如在IoC容器启动速度、AOP代理效率等方面都有所提升,这使得应用程序的运行更加高效。 2. 支持Java新特性:随着Java版本的更新,Spring也不断跟进,...
最后,Spring提供了一种更灵活的机制——`BeanPostProcessor`接口,它允许在bean初始化前后进行拦截和处理。`BeanPostProcessor`有两个关键方法:`postProcessBeforeInitialization()`和`...
这个版本的源码对于理解Spring的工作原理、学习框架设计思想以及进行二次开发都非常有价值。接下来,我们将深入探讨Spring 3.1.4中的主要知识点。 1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性...
在Spring学习案例中,每个案例都是一次深入理解Spring框架特性的实践机会。通过实际操作,你可以更好地掌握如何在真实项目中应用Spring AOP和事务处理,提高代码的可维护性和灵活性。同时,这些案例也鼓励你思考如何...
作为用户在Spring MVC测试中使用注释运行 108 12.2.4测试HTTP基本认证 109 12.3 SecurityMockMvcRequestBuilders 109 12.3.1测试基于表单的认证 109 12.3.2测试注销 110 12.4 SecurityMockMvcResultMatchers 110 ...
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 配置邮件发送...