2020.7.17学习内容
目录
注解的理解与使用
注解顾名思义有点像注释,一定程度上是有注释的效果,写上注解就是告诉程序员这个类、方法、属性有着某种属性。但是和注释不同的是很多时候注解并不是可有可无的,没有某个注解很可能会报错,编译不通过。注解按照其效果的不同时间可以分三种,分别是:SOURCE、CLASS、RUNTIME,在java.lang.annotation.RetentionPolicy里枚举了。
SOURCE是源码级别的注解,仅在.java文件中起作用,如果违反注解则会在IDE标红。
CLASS是编译时期的注解,也是默认的级别。在编译时生效,生成class文件时起效,如果违反会报错。
RUNTIME是运行期的注解,在运行时会通过反射等方式生效。
default关键字
defalut关键字是JAVA8开始的关键字,作用是在interface内可以直接实现方法了,配合lambda表达式使用
SpringCache失效问题
问题重现:在同一个类中调用一个使用 @Cacheable注解的方法,发现cache并不生效,直接访问数据库了
Service中的实现
@Override
@Cacheable("userList")
public List<User> selectAll()
{
System.out.println("----------------------------------used!");
return userDao.selectAll();
}
public List<User> select2() {
System.out.println("select2-----------------------------------");
List <User> result = this.selectAll();
return result;
}
controller中调用
public String selectAll() {
List<User> result = new ArrayList<>();
try {
result = userService.selectAll();
result = userService.select2();
} catch (Exception e) {
e.printStackTrace();
}
return JSON.toJSONString(result);
}
结果
进入debug模式调试探究问题
设置四个断点,使用idea 的Run to cursor快捷键Ctrl+R直接跳到下一个断点,不使用step into会进入class文件中,进入到spring的源码里。调式结果如图
可以看到selectAll方法是使用代理类调用的,缓存生效
而这个selectAll是使用UserServiceImpl的实例调用的,而不是代理类调用,而Cache注解都是通过代理类实现的,因此,缓存失效
参考
https://blog.csdn.net/suifeng3051/article/details/51801018
defalut关键字