`
flyPig
  • 浏览: 139836 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

SpringAOP的一个问题

阅读更多
问题:项目中用到了AOP方式记录日志,对于所有create开头的方法全部做了拦截。现在有一个类,里面有createFile方法和newFolder方法,newFolder方法里面会调用到createFile方法,但此时,createFile的拦截记录日志却起不到作用,这是为什么呢。

缘由:Spring的AOP实现方式有两种:Java动态代理和Cglib动态增强,这两种方式在Spring中是可以无缝自由切换的。Cglib方式增强的AOP目标类,会创建两个对象,一个是Bean实例本身,一个是Cglib增强代理对象。Spring通过AopProxy接口,抽象了这两种实现,实现了一致的AOP方式。但是这种抽象带了一个缺陷,那就是扼杀了Cglib能够直接创建普通类的增强子类的能力,Spring相当于把Cglib动态生成的子类,当普通的代理类了。回到问题上就是:newFolder方法经过AopProxy给过滤掉,方法内部调用createFile,虽然配置了方法拦截,但是因为是内部调用,AopProxy感知不到,因此拦截日志起不到作用。

延伸:这个问题,可以延伸到同样AOP性质的声明式事务。如果createFile配置了事务,但是newFolder没有配置,同理,newFolder方法内的createFile并不会开启事务,假设createFile被调用了3次,第三次产生错误,事务并不能正常的回滚了。因此可以认为:内部调用时,被调用方法的事务声明将不起作用;同样事务的传播策略在内部方法调用时将不起作用

解决:这个东西我没想到什么好方法改变,只能避开Spring目前的AOP实现上的限制,要么都声明要事务,要么分开成两个类,要么直接在方法里使用编程式事务。
分享到:
评论

相关推荐

    spring aop jar 包

    Spring AOP(Aspect Oriented Programming,面向切面...总的来说,Spring AOP通过提供面向切面的编程能力,极大地提高了代码的可复用性和可维护性,降低了系统复杂度,特别是在处理共性问题如日志、事务、安全等方面。

    Spring AOP 16道面试题及答案.docx

    引介(Introduction)是Spring AOP的一个特性,允许在通知对象中声明并实现它们原本未实现的额外接口。通过`@DeclareParents`注解可以实现引介。 连接点(Joint Point)是程序执行过程中的特定点,通常在Spring AOP...

    简单spring aop 例子

    现在,我们来看如何创建一个简单的Spring AOP例子: 1. **定义切面(Aspect)**:切面是包含通知(Advice)和切入点(Pointcut)的类。通知定义了要执行的逻辑,切入点定义了何时执行。例如,我们可以创建一个名为`...

    Spring Aop四个依赖的Jar包

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...

    spring aop 五个依赖jar

    5. **aopalliance-1.0.jar**:AOP Alliance是一个库,定义了一些通用的AOP接口,使得不同的AOP框架(如Spring AOP和AspectJ)可以互操作。它包含了一些基本的AOP概念,如Advisor、Pointcut和Proxy等,是连接不同AOP...

    Spring AOP完整例子

    在Spring AOP的例子中,我们可能会创建一个`@RunWith(SpringJUnit4ClassRunner.class)`标记的测试类,以利用Spring的测试支持。在测试方法中,可以注入需要的bean,然后调用方法来触发AOP代理。这样,通知将在适当的...

    springAOP 4个jar包

    在Spring AOP中,当无法使用Java的标准接口代理(例如,目标类没有接口)时,CGLIB就会被用到,生成一个目标类的子类并在其中插入切面逻辑。CGLIB-nodep版是精简版,不依赖于外部的ASM库,降低了依赖性。 4. **aop...

    spring aop依赖jar包

    4. **织入(Weaving)**:织入是将切面应用到目标对象,创建一个代理对象的过程。Spring支持三种织入方式:编译时织入、加载时织入和运行时织入。最常见的是运行时织入,通过Spring的代理机制实现。 现在,我们回到...

    Spring源码最难问题:当Spring AOP遇上循环依赖.docx

    Spring源码中最难的问题之一是循环依赖问题,当Spring AOP遇上循环依赖时,该如何解决? Spring通过三级缓存机制解决循环依赖的问题。 在Spring中,bean的实例化过程中,会先尝试从三级缓存中获取bean,这也是...

    spring AOP依赖三个jar包

    - **事务管理**:Spring AOP的一个常见应用就是声明式事务管理,通过`@Transactional`注解可以轻松地在方法级别控制事务。 综上所述,spring AOP依赖的这三个jar包构成了Spring框架面向切面编程的基础,它们共同...

    Spring AOP实现机制

    - 当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建一个代理对象。 - 代理对象在调用实际方法前后,会插入相应的通知代码,从而实现AOP功能。 - **CGLIB代理**: - 如果目标...

    Spring AOP面向方面编程原理:AOP概念

    接下来,我们通过一个简单的Spring AOP示例来加深对上述概念的理解。假设我们需要在调用某个公共方法前记录日志,我们可以定义一个`BeforeAdvice`,并在目标方法上应用此通知。 ```java package com.example.aop; ...

    spring aop的demo

    在`springAop1`这个压缩包中,可能包含了一个简单的应用示例,展示了如何定义一个切面类,以及如何在该类中定义通知方法。例如,我们可能会看到一个名为`LoggingAspect`的类,其中包含了`@Before`注解的方法,用于在...

    一个简单的spring AOP的实现

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要特性。它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。通过AOP,我们可以将这些...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    `AbstractAutoProxyCreator` 会查找 Spring 上下文中的 `Advisor`(顾问),每个 `Advisor` 包含一个 `Advice`(通知)和一个 `Pointcut`(切点)。通过匹配切点,找出适用于目标 Bean 的 `Advisor`,然后根据代理...

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    Spring AOP简单demo

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要模块,它扩展了传统的面向对象编程,允许开发者定义“横切关注点”(cross-cutting concerns),如日志、事务管理、性能监控等。...

    springaop多数据库读写分离

    2. **定义切面**:创建一个Spring AOP切面,这个切面将包含一个或多个通知(advice),用于拦截特定的数据库操作。例如,我们可以创建一个`@Before`通知,检查方法的注解或方法名,以判断是读操作还是写操作。 3. *...

    springAop的配置实现

    CGLIB是一个强大的高性能的代码生成库,它会在运行期动态生成子类并覆盖父类的方法来实现AOP的功能。 **4. 配置Spring AOP** 在Spring XML配置文件中,我们可以定义以下元素来实现AOP配置: - `<aop:config>`:声明...

    Spring aop Spring aop

    Spring aop Spring aop

Global site tag (gtag.js) - Google Analytics