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