情景: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、可将父类中的方法在子类中覆写。