示例bean:
public class SomeBean { public void methodA() { this.methodB(); } public void methodB() { System.out.println("methodB executing..."); } } public class TestBean { private SomeBean someBean; public void outterMethod() { someBean.methodA(); } public void outterMethod2() { someBean.methodB(); } //getter&setter 略... }
上述两个类被定义成Spring的bean,并且outterMethod、methodA和methodB都在Spring的aop拦截范围内。
当由外部调用testBean.outterMehtod()方法时,产生了一次AOP拦截,接着outterMehtod调用someBean.methodA()时,又产生了一次AOP拦截,但是当methodA调用methodB时,将不会产生AOP拦截。
也就是说Spring中同一个bean的内部方法之间的调用,是不会产生AOP代理的。
基于以上原因,在Spring的事务配置中,如果methodB的每次调用都需要开启一个新的事务的话(propagation设置成REQUIRS_NEW),则当执行outterMethod方法时methodB无法成功开启新事务(因为methodB由methodA调用)。但是当执行outterMethod2方法时,methodB可以成功开启属于自己的新事务。
因此,如果methodB一定要开启一个自己的AOP代理的话,请把methodB放在一个独立的类中并且确保methodB不在类内部被调用。
相关推荐
在 Spring AOP 中,`org.springframework.aop.framework.JdkDynamicAopProxy` 类实现了 `InvocationHandler` 接口,当代理对象的方法被调用时,实际会执行 `JdkDynamicAopProxy.invoke()` 方法。这个方法会检查并...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过插入切面来增强或改变程序的行为。在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型...
你可能会看到如何通过Spring AOP自定义代理类,以及如何利用JDK动态代理和CGLIB来拦截并增强方法的执行。 3. **第六章_cache-demo.zip**:此示例可能进一步扩展了缓存相关的实现,包括不同类型的缓存策略、缓存更新...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的可复用性和可维护性。 ### 1. ...
Spring AOP主要支持方法调用作为连接点。 3. **通知(Advice)**:在特定的连接点处执行的动作,如before通知(在连接点之前执行),after通知(在连接点之后执行),around通知(环绕连接点执行)等。通知是AOP中...
环绕通知是Spring AOP中最强大的一种增强方式,它允许在方法调用前后执行自定义的逻辑,并可以选择是否执行目标方法。环绕通知通过`@Around`注解实现,需要实现`ProceedingJoinPoint`接口的`proceed()`方法来调用...
代理类中的sayHello()方法会在调用原Hello类的sayHello()方法之前和之后分别调用Logger类进行日志记录。 这种通过代理模式实现的AOP方法,可以很好地将业务逻辑代码与额外的横切关注点分离,使得代码更加清晰,易于...
6. **引入(Introduction)**:Spring AOP允许在现有类中添加新的方法或属性,这称为类型引入。这可以用于向旧的非AOP类添加新行为,例如添加日志或事务支持。 7. **配置方式**:Spring AOP可以通过XML配置、注解...
"spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨Spring AOP、相关jar文件以及它们在实际开发中的作用。 首先,我们来看一下提供的文件: 1. aopalliance.jar:这是一...
在运行时,JDK动态代理会创建一个新的类,该类实现目标对象的所有接口,并在方法调用时插入自定义的行为(通知)。Spring的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口是实现JDK动态...
2. **CGLIB动态代理**:如果目标类没有实现接口,Spring会使用CGLIB库创建一个目标类的子类,子类覆盖目标类的方法并在方法调用前后插入通知。CGLIB代理提供了更广泛的应用场景,但相比JDK动态代理,它的性能稍差。 ...
使用Spring AOP,可以在方法执行前后自动记录日志,无需在每个方法内部添加日志代码。 3.2 事务管理 Spring AOP提供声明式事务管理,可以在切点上定义事务边界,使得事务处理代码不再侵入业务逻辑。 3.3 安全控制...
- `spring-beans.jar`:Spring Bean的定义和管理,AOP与之紧密关联。 - `spring-core.jar`:Spring的基础库,提供核心工具类和IoC容器。 - `spring-context.jar`:提供了AOP、事件、国际化等功能,是Spring的核心...
最后,本文的目标是从实现的角度来认识 SpringAOP 框架,观察的角度是从外部接口、内部实现、组成部分、执行过程四个方面来认识 SpringAOP 框架。本文的风格是首先列出 AOP 的基本概念,然后介绍框架所涉及到的核心...
在Java开发领域,Spring框架是应用最广泛的轻量级框架之一,它提供了众多功能,包括依赖注入、面向切面编程(AOP)等。本文将详细介绍在使用Spring AOP时所需的两个关键jar包:aopalliance-1.0.jar和aspectjweaver-...
此外,Spring AOP不会对最外层的`public`方法内部调用的其他方法也进行拦截,即只停留于代理对象所调用的方法。例如,在下面的例子中: ```java public class B { public void foo1() { System.out.println("foo1...
切点是匹配通知应与之关联的方法或类的模式。Spring AOP支持基于注解和表达式的切点定义。例如,`@Before("execution(* com.example.service.*.*(..))"` 将在`com.example.service`包下所有类的所有方法调用前执行...
在Spring AOP(面向切面编程)中,Advise(增强方法)是核心概念之一,它允许我们在不修改原有业务代码的情况下,通过拦截器模式来插入额外的功能或行为。这篇博客文章“Spring Aop Advise方法(增强方法) 中获取目标...
Spring AOP 之链式调用的实现 在 software development 中,Aspect-Oriented Programming(AOP)是一种编程范式,旨在将横切关注点从业务逻辑中分离出来,使得代码更加模块化、灵活和可维护。Spring AOP 是一种基于...
通过上述两种方式,我们都可以实现对 `UserService` 类的 AOP 增强,从而实现方法调用前后的日志记录。 ### 总结 AOP 是一种强大的编程范式,它通过将横切关注点从业务逻辑中分离出来,提高了代码的可维护性和可...