关于@Cached的理解

原创
2011/06/04 21:49
阅读数 3.2K
public class Cache {
	@Property
	private int watch;
	@Property
	private List<User> users;
	@Property
	private List<User> users2;

	private UserDao userDao = new UserDao();

	// @Cached(watch = "watch")  1处
	List<User> getU() {
		return userDao.getUsers();
	}

	void onActivate() {
		users = getU();
		// watch++;  2处
		users2 = getU();
	}
}

<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" xmlns:p="tapestry:parameter">
	<t:grid source="users"/><br/>
	<t:grid source="users2"/><br/>
</html>

public class UserDao {
	public List<User> getUsers() {
		List<User> result = new ArrayList<User>();

		User user = new User();
		user.setName("loupo" + new Random().nextInt(106));
		result.add(user);
		return result;
	}
}

Cache.java文件是页面类,该类中users和users2是用来显示Dao的返回结果的。

页面类中有两个地方被注释掉了,分别是1处和2处。

@Cached注释的作用是缓存被注释的方法的返回值。通过watch参数可以指定在什么时候刷新缓存值。

测试1:1处和2处都保留注释

该测试中,因onActivate方法中分别对users和user2都使用了getU()进行赋值,所以页面中grid的两个表格是不同的两个name的user(Dao中只生成一个User对象,使用随机数来设置name值),如果是相同的,多刷新几次,肯定是不同的次数更加多一点才对的。

测试2:取消1处的注释,并将注释的内容改为

// @Cached    1处

该测试中,同样的onActivate方法中分别对users和user2都使用getU()进行赋值,但是页面中grid显示的表格确实两个相同的内容,这就是因为我们在对user2进行复制的时候,因为之前getU()已经被@Cached注释了,所以方法的返回结果被缓存了,这样第二次调用,也就是对user2进行赋值的时候使用的是缓存值内容,所以两个grid显示的内容相同。

测试3:取消注释1处

// @Cached(watch = "watch")  1处

保留watch参数,同时取消2处的注释

该测试中,我们又看到了两个不同的grid内容(内容相同就多刷新几次,肯定不同的多),这是因为,我们为@Cached增加了watch参数,表示对getU()方法的调用会检测watch(页面类的watch属性)属性的值是否变化了,如果变化了,就刷新缓存值,所以在对users2进行赋值的时候比users赋值的时候watch变化了,所以赋值users2的时候刷新了缓存值,users和users2也就不同了。

 

上述解释中可能注释(annotation的意思)和注释(说明的内容)会有点乱,大家担待了。

 

 

 

 

 

 

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
在线直播报名
返回顶部
顶部