关于@Cached的理解

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的意思)和注释(说明的内容)会有点乱,大家担待了。

 

 

 

 

 

 

转载于:https://my.oschina.net/namespace/blog/23534

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值