-
Spring AOP中使用@pointcut("@within(xxxx)") 对没有public方法的类未生成proxy (模板模式的实现)5
问题已发:
http://stackoverflow.com/questions/12559713/aspectj-expession-within-doesnt-effect-on-concrete-class-which-doesnt-have
纠结几天了, 谢谢~~2012年9月24日 14:23
2个答案 按时间排序 按投票排序
-
采纳的答案
@within() 是一种静态切入点 即在IoC容器初始化完毕后就能确定的
判断是否匹配通过
[url] public static boolean canApply(Pointcut pc, Class targetClass, boolean hasIntroductions) {
if (!pc.getClassFilter().matches(targetClass)) {
return false;
}
MethodMatcher methodMatcher = pc.getMethodMatcher();
IntroductionAwareMethodMatcher introductionAwareMethodMatcher = null;
if (methodMatcher instanceof IntroductionAwareMethodMatcher) {
introductionAwareMethodMatcher = (IntroductionAwareMethodMatcher) methodMatcher;
}
Set classes = new HashSet(ClassUtils.getAllInterfacesForClassAsSet(targetClass));
classes.add(targetClass);
for (Iterator it = classes.iterator(); it.hasNext();) {
Class clazz = (Class) it.next();
Method[] methods = clazz.getMethods();
for (int j = 0; j < methods.length; j++) {
if ((introductionAwareMethodMatcher != null &&
introductionAwareMethodMatcher.matches(methods[j], targetClass, hasIntroductions)) ||
methodMatcher.matches(methods[j], targetClass)) {
return true;
}
}
}
return false;
}[/url]
而获取方法通过 Method[] methods = clazz.getMethods(); (即只能得到public方法)
因此如果你没有一个public方法 将不实施AOP代理,所以protected方法不能被代理,但是如果有一个public的则可以代理 而且能拦截成功。
这个和我之前在论坛分析的一样 属于spring实现问题
http://www.iteye.com/topic/1125911#23683272012年9月25日 16:35
-
I found the instance of DefaultAgent was not proxied!
Tried the line as below:
applicationContext.getBeansOfType(AbstractAgent.class);
Proposed I could find something like 'DefaultAgent$$EnhancerByCGLIB$$ae10cb14', but still 'DefaultAgent'.
这种方法会自动调用目标对象的toString(),所以拿不到类似于DefaultAgent$$EnhancerByCGLIB$$ae10cb14, 可以输出getClass();
@Pointcut("@within(source.service.Broker)") 对protected应该也是没问题的,你的spring和aspectj版本是?
1、
http://jinnianshilongnian.iteye.com/blog/1415606
2、
http://www.iteye.com/topic/1125911#23683272012年9月24日 14:53
相关推荐
所以从本文开始介绍@Pointcut切点表达式,虽然Spring AOP的切点表达式尚未 全部实现 @AspectJ 的切点指示符,但是也已经足够多和灵活,本文主要介绍@Pointcut切点表达式中的@within、within这两种切点指示符,结合...
在微服务流行的当下,在使用SpringCloud/Springboot框架开发中,AOP使用的...本资源是@Pointcut使用@annotation的方式,结合五种通知Advice实现了打印方法Log的功能。 有任何问题,欢迎大家私信联系我. 作者:天罡gg
### Spring中的AOP不生效的原因及解决方法 在Java开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的编程思想和技术手段,主要用于处理横切关注点问题,如日志记录、性能统计、安全控制、...
通过上述步骤,我们了解了如何使用Spring Boot中的@Pointcut注解定义切点表达式,以及如何利用AspectJ框架来实现面向切面编程。这种技术不仅可以帮助开发者更方便地管理横切关注点,还可以提高代码的可读性和可维护...
在IT行业中,Spring框架是Java企业级应用开发的首选框架,尤其在面向切面编程(AOP)方面表现卓越。本篇文章将详细讲解Spring AOP的实例,包括Pointcut和Advisor两个关键概念,同时结合源码和工具进行深入探讨。 ...
在Spring框架中,切入点(pointcut)表达式是AOP(面向切面编程)的核心组成部分,用于定义关注点的精确位置,比如哪些方法应该被拦截。切入点表达式是基于AspectJ语法的,允许开发者精确地指定要拦截的方法。下面将详细...
代理对象在调用方法时会触发InvocationHandler的invoke()方法,从而可以在这个方法中实现对方法调用的拦截。JDK动态代理要求被代理类必须实现一个接口,代理类会实现相同的接口。 Spring框架中的AOP模块使用了动态...
标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...
SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...
- 使用`@Aspect`注解定义切面类,`@Pointcut`定义切入点方法,`@Before`、`@After`、`@Around`等定义不同类型的通知。 ### 5. Spring AOP的应用场景 - **日志记录**:在方法调用前后记录操作信息。 - **事务管理*...
在Spring AOP中,`Proxy`类会根据目标对象的接口生成一个代理类,这个代理类会实现目标对象的所有接口,并在每个方法调用前后插入相应的通知。`InvocationHandler`接口定义了一个`invoke`方法,当调用代理对象的方法...
在Spring框架中,面向切面编程(AOP)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、权限控制等,这些关注点可以被模块化并独立于业务逻辑进行处理。本篇文章将深入探讨如何通过Spring的注解...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...
本节将详细介绍如何使用Spring AOP实现流程日志跟踪,主要关注于如何通过AOP拦截特定的类和方法来进行日志记录。 ##### 3.1 配置Spring AOP 在Spring配置文件中定义切面和切入点表达式是非常关键的一步。一般来说...
2. **注解配置**:Spring 2.5引入了基于注解的AOP配置,可以在切面类上使用@Aspect注解,@Before、@After、@AfterReturning、@AfterThrowing和@Around定义通知,@Pointcut定义切点。例如: ```java @Aspect ...
本篇文章将深入探讨Spring AOP中的动态代理、责任链模式以及注解的使用。 首先,动态代理是实现AOP的关键技术之一。在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB。JDK动态代理基于接口,当目标类...
Spring AOP的实现基于动态代理,对于接口实现类,它使用Java的`java.lang.reflect.Proxy`类来创建代理对象;对于没有接口的类,Spring使用CGLIB库生成子类。在运行时,Spring AOP会根据切面定义生成代理对象,然后...
- **CGLIB代理**:如果目标类没有实现接口,Spring会使用CGLIB库创建一个目标类的子类,并在子类中插入通知代码。 - **基于注解的AOP**:使用`@Aspect`、`@Before`、`@After`、`@Around`、`@Pointcut`等注解定义切...
- **JDK动态代理**:当目标对象实现了至少一个接口时,Spring会使用Java的Proxy类创建一个代理对象,该代理对象在运行时动态生成,并在调用实际方法前/后插入通知代码。 - **CGLIB代理**:如果目标对象没有实现...
Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,对程序的行为进行统一管理和增强。在这个场景中,我们将使用Spring AOP来实现一个日志记录的功能,以追踪系统中各个...