0 0

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个答案 按时间排序 按投票排序

0 0

采纳的答案

@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#2368327

2012年9月25日 16:35
0 0

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#2368327

2012年9月24日 14:53

相关推荐

    【Spring AOP】@Aspect结合案例详解(二): @Pointcut使用@within和within

    所以从本文开始介绍@Pointcut切点表达式,虽然Spring AOP的切点表达式尚未 全部实现 @AspectJ 的切点指示符,但是也已经足够多和灵活,本文主要介绍@Pointcut切点表达式中的@within、within这两种切点指示符,结合...

    【Spring AOP】@Aspect结合案例详解(一): @Pointcut使用@annotation + 五种通知

    在微服务流行的当下,在使用SpringCloud/Springboot框架开发中,AOP使用的...本资源是@Pointcut使用@annotation的方式,结合五种通知Advice实现了打印方法Log的功能。 有任何问题,欢迎大家私信联系我. 作者:天罡gg

    Spring中的AOP不生效

    ### Spring中的AOP不生效的原因及解决方法 在Java开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的编程思想和技术手段,主要用于处理横切关注点问题,如日志记录、性能统计、安全控制、...

    如何使用Spring Boot的@Pointcut注解

    通过上述步骤,我们了解了如何使用Spring Boot中的@Pointcut注解定义切点表达式,以及如何利用AspectJ框架来实现面向切面编程。这种技术不仅可以帮助开发者更方便地管理横切关注点,还可以提高代码的可读性和可维护...

    Spring AOP Example – Pointcut , Advisor

    在IT行业中,Spring框架是Java企业级应用开发的首选框架,尤其在面向切面编程(AOP)方面表现卓越。本篇文章将详细讲解Spring AOP的实例,包括Pointcut和Advisor两个关键概念,同时结合源码和工具进行深入探讨。 ...

    详解Spring 框架中切入点 pointcut 表达式的常用写法

    在Spring框架中,切入点(pointcut)表达式是AOP(面向切面编程)的核心组成部分,用于定义关注点的精确位置,比如哪些方法应该被拦截。切入点表达式是基于AspectJ语法的,允许开发者精确地指定要拦截的方法。下面将详细...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    代理对象在调用方法时会触发InvocationHandler的invoke()方法,从而可以在这个方法中实现对方法调用的拦截。JDK动态代理要求被代理类必须实现一个接口,代理类会实现相同的接口。 Spring框架中的AOP模块使用了动态...

    在自定义spring aop中使用el获取拦截方法的变量值。

    标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...

    springboot+aspect实现springaop拦截指定方法.zip

    SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...

    Spring AOP实现机制

    - 使用`@Aspect`注解定义切面类,`@Pointcut`定义切入点方法,`@Before`、`@After`、`@Around`等定义不同类型的通知。 ### 5. Spring AOP的应用场景 - **日志记录**:在方法调用前后记录操作信息。 - **事务管理*...

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    在Spring AOP中,`Proxy`类会根据目标对象的接口生成一个代理类,这个代理类会实现目标对象的所有接口,并在每个方法调用前后插入相应的通知。`InvocationHandler`接口定义了一个`invoke`方法,当调用代理对象的方法...

    使用Spring的注解方式实现AOP的细节

    在Spring框架中,面向切面编程(AOP)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、权限控制等,这些关注点可以被模块化并独立于业务逻辑进行处理。本篇文章将深入探讨如何通过Spring的注解...

    spring aop jar 包

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...

    spring aop切面拦截指定类和方法实现流程日志跟踪

    本节将详细介绍如何使用Spring AOP实现流程日志跟踪,主要关注于如何通过AOP拦截特定的类和方法来进行日志记录。 ##### 3.1 配置Spring AOP 在Spring配置文件中定义切面和切入点表达式是非常关键的一步。一般来说...

    springAOP配置动态代理实现

    2. **注解配置**:Spring 2.5引入了基于注解的AOP配置,可以在切面类上使用@Aspect注解,@Before、@After、@AfterReturning、@AfterThrowing和@Around定义通知,@Pointcut定义切点。例如: ```java @Aspect ...

    SpringAOP之探秘(动态代理、责任链模式、注解使用)

    本篇文章将深入探讨Spring AOP中的动态代理、责任链模式以及注解的使用。 首先,动态代理是实现AOP的关键技术之一。在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB。JDK动态代理基于接口,当目标类...

    Spring AOP 概念理解及@AspectJ支持

    Spring AOP的实现基于动态代理,对于接口实现类,它使用Java的`java.lang.reflect.Proxy`类来创建代理对象;对于没有接口的类,Spring使用CGLIB库生成子类。在运行时,Spring AOP会根据切面定义生成代理对象,然后...

    Spring Aop使用实例

    - **CGLIB代理**:如果目标类没有实现接口,Spring会使用CGLIB库创建一个目标类的子类,并在子类中插入通知代码。 - **基于注解的AOP**:使用`@Aspect`、`@Before`、`@After`、`@Around`、`@Pointcut`等注解定义切...

    Spring基础:Spring AOP简单使用

    - **JDK动态代理**:当目标对象实现了至少一个接口时,Spring会使用Java的Proxy类创建一个代理对象,该代理对象在运行时动态生成,并在调用实际方法前/后插入通知代码。 - **CGLIB代理**:如果目标对象没有实现...

    Spring AOP的简单实现

    Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,对程序的行为进行统一管理和增强。在这个场景中,我们将使用Spring AOP来实现一个日志记录的功能,以追踪系统中各个...

Global site tag (gtag.js) - Google Analytics