Spring AOP导致外部无法获取成员变量的问题

逝水fox 发布于 2013/04/09 11:15
阅读 789
收藏 2

我有定义一个类:

@Transactional(propagation = Propagation.REQUIRED)
public abstract class DataCache implements Serializable {
	/**
	 * 最后一次更新缓存数据时间
	 */
	private long lastUpdate = 0;

	// ... 其他成员属性和方法

	public synchronized Object get() throws DataCacheExcption {
		long now = System.currentTimeMillis();

		if ((data == null) || ((now - lastUpdate) > cycle)) { // 从上次更新到现在为止的时间超过了更新周期,触发缓存更新
			// 更新缓存以及对应的更新时间
			data = loadObject();
			lastUpdate = now;
		}

		return data;
	}

	synchronized long getLastUpdate() {
		return lastUpdate;
	}
}

上面访问get方法的时候就会更新自身的lastUpdate属性值,我把这个对象的实现对象定义到Spring容器中,并且确认get方法已调用了,并且已确认lastUpdate属性已经有修改。

然后这个时候我执行getLastUpdate方法,却发现返回值为0,我改成直接获取lastUpdate属性值仍然返回的是0。debug发现我获取到的实例实际上是cglib生成的一个扩展实例。把@Transactional取消后恢复正常。(即使我不把@Transactional声明在class上而是声明给get方法,这个问题仍然存在)。就像是cglib扩展我原有类的时候,子类重新声明了一个lastUpdate属性。

不知道有没有哪位知道这是什么状况。

----------------------------------------------------------------------------------

果然....


加载中
0
逝水fox
逝水fox
大致原因想到了,找到解决方法了。不过有点晕。
逝水fox
逝水fox
回复 @陈祖煌 : 这个是好久以前的事情了,不确定现在是不是有这个情况。。。当时是断点debug直接看的内存情况,源码倒是没翻过
陈祖煌
陈祖煌
用代理对象的.getClass().getDeclaredFields()方法也看不到代理类有覆盖被代理类的成员属性。甚至在被代理类中,给成员属性加上final关键字,通过spring cglib创建出来的代理对象访问这些成员属性得到的仍然是null
陈祖煌
陈祖煌
遇到同样问题。我把cglib生成的动态代理类反编译出来了,但是没看到代理类有重新声明父类的成员属性。请问你是怎么判断代理类有重新声明父类的成员属性的呢?
返回顶部
顶部