spring aop 同一个bean中方法调用方法
2016-08-30 17:25
253 查看
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不在类内部被调用。
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 同一个bean中方法调用方法
- spring aop 同一个类中一个方法调用另一个方法,拦截不到被调用的方法
- 在同一个类中调用另一个方法没有触发 Spring AOP 的问题
- 在同一个类中调用另一个方法没有触发 Spring AOP 的问题【转】
- Spring AOP代理机制以及方法调用在同一个类的另一个方法的问题
- 在同一个类中调用另一个方法没有触发 Spring AOP 的问题
- 使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。
- Spring入门学习——调用一个实例工厂方法创建Bean
- Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)
- 做一个合格的程序猿之浅析Spring AOP源码(十五) 分析JdkDynamicAopProxy的invoke方法
- spring AOP Bean添加新方法
- main方法中调用spring注入bean
- Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况,在方法调用前和调用后记录相关日志。)
- 随web容器启动Java类,调用spring容器中的的bean及其方法
- Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况,在方法调用前
- 做一个合格的程序猿之浅析Spring AOP源码(十四) 分析ProxyFactoryBean
- spring事务处理:调用一个方法前的事务处理过程
- SPRING中BEAN注入成功,可是启动WEB服务器,调用方法时,BEAN全是空,NullpointerException
- Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况)
- Spring之Bean生命周期方法调用