spring cglib使用aop:aspectj-autoproxy的异常问题及解决

情景:Spring配置<aop:aspectj-autoproxy proxy-target-class="true" />后,在继承父类或实现接口的bean中修改父类或接口中的属性值在父类或接口中使用不生效。

例如有父类:

public abstract class GSAction {

	Logger log = LoggerFactory.getLogger(GSAction.class);

	protected boolean updateDrawNumber = true;// 更新状态

	public final void exec(Process process) throws Exception {
		ParaDrawnumber drawNumber = ContextHelper.getDrawNumber(process);
		try {
			doAction(process, drawNumber);
			update(drawNumber);
			doNotify(process, drawNumber);
		} catch (Throwable e) {
			log.error("", e);
		}
	}

	private void doNotify(Process process, ParaDrawnumber drawNumber) {
		// TODO Auto-generated method stub
	}

	private void update(ParaDrawnumber drawNumber) {
		if(updateDrawNumber){
                //TODO update
                }
	}

	private abstract void doAction(Process process, ParaDrawnumber drawNumber);
}
子类:

public class SubAction extends GSAction {

	public void doAction(Process process, ParaDrawnumber drawNumber) {
		if(process.isStopped()){
			this.updateDrawNumber = false;
		}else{
			//TODO other
		}
	}

}
即我遇到的问题是:子类执行exec方法,假如在doAction将继承的属性updateDrawNumber 的值修改为false,然后继续执行update方法,此时update方法中updateDrawNumber的值并不是 doAction方法中修改后的值,而是原来的值。

原因:cglib主要实现对没有继承和实现接口的类的代理。proxy-target-class值配置为true后强制对所有bean都生成了代理,致使对父类也生成了一个代理对象(未看源码,调试得出的结论),看下两个图。第1个图右侧,在子类updateDrawNumber的值已经为false了,但是在跟踪到父类的实际值如第2个图还是原来的true值。



解决方法:

1、将proxy-target-class的配置值修改为false,则有继承或实现接口的bean可使用jdk动态代理,子类修改的值在父类中可见。

2、可将父类中的方法在子类中覆写。


参考:aop:aspectj-autoproxy作用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值