Spring的一些功能的记录

1、缓存
使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回结果,而使用@CacheEvict标记的方法会在方法执行前或者执行后移除Spring Cache中的某些元素。
@Cacheable可以指定三个属性,value、key和condition
value属性是必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。其可以是一个Cache也可以是多个Cache,当需要指定多个Cache时其是一个数组。
@Cacheable(“cache1”)//Cache是发生在cache1上的

public User find(Integer id) {

  returnnull;

}

@Cacheable({“cache1”, “cache2”})//Cache是发生在cache1和cache2上的

public User find(Integer id) {

  returnnull;

}

key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。
@Cacheable(value=“users”, key="#id")

public User find(Integer id) {

  returnnull;

}

@Cacheable(value=“users”, key="#p0")

public User find(Integer id) {

  returnnull;

}

有的时候我们可能并不希望缓存一个方法所有的返回结果。通过condition属性可以实现这一功能。condition属性默认为空,表示将缓存所有的调用情形。
@Cacheable(value={“users”}, key="#user.id", condition="#user.id%2==0")

public User find(User user) {

  System.out.println("find user by user " + user);

  return user;

}

上述使用方法参数作为key之外,Spring还为我们提供了一个root对象可以用来生成key。通过该root对象我们可以获取到以下
methodName 当前方法名 #root.methodName

method 当前方法 #root.method.name

target 当前被调用的对象 #root.target

targetClass 当前被调用的对象的class #root.targetClass

args 当前方法参数组成的数组 #root.args[0]

caches 当前被调用的方法使用的Cache #root.caches[0].name

当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。

@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。
allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。
@CacheEvict(value=“users”, allEntries=true)

public void delete(Integer id) {

  System.out.println("delete user by id: " + id);

}

清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。

@CacheEvict(value=“users”, beforeInvocation=true)

public void delete(Integer id) {

  System.out.println("delete user by id: " + id);

}

2、@CrossOrigin
origins : 允许可访问的域列表

maxAge:准备响应前的缓存持续的最大时间(以秒为单位)

@CrossOrigin(origins = “http://domain2.com”, maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
    // ...
}

@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
    // ...
}

}

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

@CrossOrigin(origins = "http://domain2.com")
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
    // ...
}

@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
    // ...
}

}

2、@scheduled的cron
Cron表达式由6或7个空格分隔的时间字段组成:秒 分钟 小时 日期 月份 星期 年
字段  允许值  允许的特殊字符
秒   0-59     , - * /
分   0-59     , - * /
小时 0-23     , - * /
日期 1-31     , - * ? / L W C
月份 1-12     , - * /
星期 1-7      , - * ? / L C #
年 1970-2099   , - * /

/表示增量
0/5 * * * * ? : 每5秒执行一次
*”字符被用来指定所有的值
“-”字符被用来指定一个范围
“,”字符被用来指定另外的值
“?”字符只在日期域和星期域中使用

L是‘last’的省略写法可以表示day-of-month和day-of-week域
字符“W”只允许日期域出现。这个字符用于指定日期的最近工作日
“L”和“W”可以在日期域中联合使用,LW表示这个月最后一周的工作日
字符“#”只允许在星期域中出现。这个字符用于指定本月的某某天。例如:“6#3”表示本月第三周的星期五

例子如下:

0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
“0 0 12 * * ?” 每天中午12点触发
“0 15 10 ? * *” 每天上午10:15触发
“0 15 10 * * ?” 每天上午10:15触发
“0 15 10 * * ? *” 每天上午10:15触发
“0 15 10 * * ? 2005” 2005年的每天上午10:15触发
“0 * 14 * * ?” 在每天下午2点到下午2:59期间的每1分钟触发
“0 0/5 14 * * ?” 在每天下午2点到下午2:55期间的每5分钟触发
“0 0/5 14,18 * * ?” 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
“0 0-5 14 * * ?” 在每天下午2点到下午2:05期间的每1分钟触发
“0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2:44触发
“0 15 10 ? * MON-FRI” 周一至周五的上午10:15触发
“0 15 10 15 * ?” 每月15日上午10:15触发
“0 15 10 L * ?” 每月最后一日的上午10:15触发
“0 15 10 ? * 6L” 每月的最后一个星期五上午10:15触发
“0 15 10 ? * 6L 2002-2005” 2002年至2005年的每月的最后一个星期五上午10:15触发

猜你喜欢

转载自blog.csdn.net/zhanglinlove/article/details/84405086