-
spring aop 拦截 annotation的问题30
最近写了个自定义的annotation。想用spring的aop拦截并解析出annotation的值。
但是,发现只能解析到接口的annotation,不能解析到实现类的annotation。这是为什么呢?
annotation定义代码如下:@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyTest { public String value() default "Hello World!"; }
业务实现类代码为:@Service("bo") public class BusinessServiceImp implements BusinessService{ //这里的注解不能获取到。 @MyTest("test annotation") public String update(){ System.out.println("update data!"); return "update return value!"; } public void delete(){ System.out.println("delete data!"); } }
如果将注解放在接口中,将能解析出annotation。
业务接口定义:public interface BusinessService { //这里的annotation可以获取到。实现类中的却不能获取到。这就是问题所在。纠结啊。 @MyTest("test annotation") public String update(); public void delete(); }
AOP的around方法为:public Object around(ProceedingJoinPoint pjp) throws Throwable{ System.out.println("环绕通知前"); MethodSignature joinPointObject = (MethodSignature) pjp.getSignature(); Method method = joinPointObject.getMethod(); boolean flag = method.isAnnotationPresent(MyTest.class) ; if(flag){ MyTest annotation2 = method.getAnnotation(MyTest.class); System.out.println(method.getName() + "方法上的注解:"); System.out.println(annotation2.annotationType().getCanonicalName() + " : " + annotation2.value()+"\t"); } Object obj = pjp.proceed(); System.out.println("环绕通知后"); return obj; }
通过around的ProceedingJoinPoint对象获取到Method对象。可是获取到的Method对象似乎不是实现类的Method对象,因而解析不出annotation。这是为什么呢?
问题补充:rocketball 写道不好意思,前面的很乱
Spring的AOP有两张模式,在默认情况下,如果是目标对象实现了接口的类,采用的JDK动态代理,如果没有则创建一个CGLIB代理,你可以用CGLIB代理试试看,在你配置中修改为:
<aop:aspectj-autoproxy proxy-target-class="true"/> 就是在你原来配置的地方加上proxy-target-class="true" 让它用CGLIB代理
你说的这个我知道。只是我不想采用cglib的处理方式能获取到实现类的注解吗?
2011年1月30日 13:40
5个答案 按时间排序 按投票排序
-
用spring 的 AnnotationUtils.findAnnotation(Method method, Class<A> annotationType)
2019年11月28日 11:42
-
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface MyTest { public String value() default "Hello World!"; }
加上 @Inherited试下2013年1月31日 17:21
-
简单的说,你不能把annotation放在interface method上面,就能够实现implements class method环绕。
如果你的annotation放在接口方法上面,那么只能够环绕这个接口方法,其他override的方法是不能够被环绕的,因为你的annotation存在的class有个全限定名字,也就是com.yourpackagename.Classname的xxxmethod,aop环绕不可能找到com.yourpackagename.SubClassname的xxxmethod
我自己也没有在aspectj里面找到接口环绕的命名规则
所以综上你想实现功能,在aop里面是没有直接的实现方法的2011年2月01日 11:51
-
不好意思,前面的很乱
Spring的AOP有两张模式,在默认情况下,如果是目标对象实现了接口的类,采用的JDK动态代理,如果没有则创建一个CGLIB代理,你可以用CGLIB代理试试看,在你配置中修改为:
<aop:aspectj-autoproxy proxy-target-class="true"/> 就是在你原来配置的地方加上proxy-target-class="true" 让它用CGLIB代理2011年1月30日 16:55
-
Spring的AOP有两张模式,在默认情况下,如果是目标对象实现了接口的类,采用的JDK动态代理,如果没有则创建一个CGLIB代理,你可以用CGLIB代理试试看,在你配置中修改为:
�<aop:aspectj-autoproxy /><aop:aspectj-autoproxy /><aop:aspectj-autoproxy /><aop:aspectj-<aop:aspectj-autoproxy proxy-target-class="true"/> 就是在你原来配置的地方加上proxy-target-class="true" 让它用CGLIB代理2011年1月30日 16:54
相关推荐
写一个拦截器的类 package com.spring.aop; import org.springframework.stereotype.Component; @Component("logIntercepter") public class LogIntercepter { public void before(){ System.out.println("---...
com-aop注释权限演示
主要介绍了详解SpringBoot AOP 拦截器 Aspect,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
讲解了3种AOP的开发方式,即使用@Aspect注释符、基于Schema的配置的开发方式和Spring API的开发方式,最后在实际的Java EE项目中实现5种Spring AOP功能(日志记录器、性能分析器、权限检查拦截器、异常监视器、在线...
该项目为javax.annotation.Nonnull注释的方法参数实现了驱动的运行javax.annotation.Nonnull值检查。 在内部, @Before切入点用于拦截具有一个或多个@Nonnull注释参数的方法并检查它们的值是否为非空。 此功能由...
6.4.2. Spring AOP中使用@AspectJ还是XML? 6.5. 混合切面类型 6.6. 代理机制 6.6.1. 理解AOP代理 6.7. 以编程方式创建@AspectJ代理 6.8. 在Spring应用中使用AspectJ 6.8.1. 在Spring中使用AspectJ进行domain ...
6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点...
10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼...
Bee事务注解@Tran使用实例工程; 基于Spring boot + Bee; 涉及spring aop, 注解拦截,应该有类上和应该在方法的注解拦截. @within,@annotation使用实例.
注解包含: 拦截器 , 过滤器 , 序列化 , @After , @AfterReturning , @AfterThrowing , @annotation , @Around , @Aspect , @Autowired , @Bean , @Before , @Component , @ComponentScan , @ComponentScans , @...
10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼...
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" p:order="0"> <property name="interceptors"> <list> <ref bean="doubleSubmitInterceptor"/> </list> ...
mybatis实战教程mybatis in action之五与spring3集成附源码 mybatis实战教程mybatis in action之六与Spring MVC 的集成 mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in ...
Spring的事务管理通过AOP代理来实现 根据事务属性,对每个代理对象的每个方法进行拦截, 在方法执行前启动事务, 方法执行完毕后根据是否有异常和异常种类进行提交或回滚 spring 默认通过捕获运行时异常实现事务...
6.2.8 基于annotation方式的aop实现 391 6.3 spring 2.5事务管理机制 393 6.3.1 spring 2.5的声明式事务管理 394 6.3.2 基于xml方式的事务管理配置 396 6.3.3 基于annotation方式的事务管理配置 400 6.4 “桃园...
rest-proxy-client简介:1.基于Spring框架简化RestTemplate的使用2.集成公司封装的RestTemplate组件,在...加上org.springframework.web.bind.annotation包下的注解 (本项目引入@RestRequestBody,@RestRequestFile,不