@Scheduled注解
作用:用来开启定时任务
fixedRate和fixedDelay的区别
fixedRate 任务两次执行时间间隔是任务的开始点,而 fixedDelay 的间隔是前次任务的结束与下次任务的开始。
cron:通过表达式来配置任务执行时间
cron表达式详解
秒(0~59)
分钟(0~59)
3 小时(0~23)
4 天(0~31)
5 月(0~11)
6 星期(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
年份(1970-2099)
cron格式中特殊字符说明
@Scheduled(fixedRate = 5000) 5秒执行一次
@Cacheable注解
@Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略,这个稍后会进行说明。需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。@Cacheable可以指定三个属性,value、key和condition。
value属性指定Cache名称
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属性自定义key
key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。我们这里先来看看自定义策略,至于默认策略会在后文单独介绍。
自定义策略是指我们可以通过Spring的EL表达式来指定我们的key。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。下面是几个使用参数作为key的示例。
@Cacheable(value="users", key="#id")
public User find(Integer id) {
returnnull;
}
@Cacheable(value="users", key="#p0")
public User find(Integer id) {
returnnull;
}
@Cacheable(value="users", key="#user.id")
public User find(User user) {
returnnull;
}
@Cacheable(value="users", key="#p0.id")
public User find(User user) {
returnnull;
}
condition属性指定发生的条件
有的时候我们可能并不希望缓存一个方法所有的返回结果。通过condition属性可以实现这一功能。condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。如下示例表示只有当user的id为偶数时才会进行缓存。
@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;
}
自己写的特征服务demo
controller层
package com.xfgg.demo.controller;
import com.xfgg.demo.model.dto.FeatureDTO;
import com.xfgg.demo.model.entity.User;
import com.xfgg.demo.service.FeatureService;
import com.xfgg.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class UserParam {
@Autowired
private UserService userService;
@Autowired
private FeatureService featureService;
@RequestMapping("/show")
public String show(HttpServletRequest request){
String dim = request.getParameter("dim");
return dim;
}
@RequestMapping("/show/{dim}/{filter}/{featureid}")
public String show(User user,
@PathVariable("dim") int dim,
@PathVariable("filter") int filter,
@PathVariable("featureid") int featureid){
user.setDim(dim);
user.setFilter(filter);
user.setFeatureid(featureid);
System.out.println(user);
userService.getParams(user);
return "success";
}
@RequestMapping("/show/{dim}")
public String show(@PathVariable("dim") int dim){
FeatureDTO featureDTO=featureService.selectAll(dim);
System.out.println(featureDTO);
return "success";
}
}
dao层
package com.xfgg.demo.dao;
import com.xfgg.demo.model.entity.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserDao {
Integer getParams(User user);
User selectAll(int dim);
}
model层
package com.xfgg.demo.model.dto;
import com.xfgg.demo.model.vo.QueryParam;
import lombok.Data;
@Data
public class FeatureDTO {
private String resultType;
private int data;
private QueryParam queryParam;
public FeatureDTO(String resultType, int data, QueryParam queryParam) {
this.resultType = resultType;
this.data = data;
this.queryParam = queryParam;
}
}
package com.xfgg.demo.model.entity;
import lombok.Data;
@Data
//用来封装请求函数
public class Feature {
private int dim;
private String resultType;
private String data;
private String queryparam;
}
package com.xfgg.demo.model.entity;
import lombok.Data;
@Data
public class User {
private int dim;
private int filter;
private int featureid;
}
package com.xfgg.demo.model.vo;
import lombok.Data;
import java.util.Map;
import java.util.Set;
@Data
public class QueryParam {
private Map<String, Integer> dim;
private Map<String, Integer> filter;
private Integer featureId;
public QueryParam(Map<String, Integer> dim, Map<String, Integer> filter, Integer featureId) {
this.dim = dim;
this.filter = filter;
this.featureId = featureId;
}
}
service层
package com.xfgg.demo.service;
import com.xfgg.demo.model.dto.FeatureDTO;
import com.xfgg.demo.model.entity.User;
//获取用户特征接口并进行封装
public interface FeatureService {
FeatureDTO selectAll(int dim);
}
package com.xfgg.demo.service;
import com.xfgg.demo.model.entity.User;
//用户请求参数存入数据库
public interface UserService {
Integer getParams(User user);
}
package com.xfgg.demo.service.impl;
import com.xfgg.demo.dao.UserDao;
import com.xfgg.demo.model.dto.FeatureDTO;
import com.xfgg.demo.model.entity.User;
import com.xfgg.demo.model.vo.QueryParam;
import com.xfgg.demo.service.FeatureService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service
public class FeatureServiceImpl implements FeatureService {
@Autowired
private UserDao userDao;
@Override
public FeatureDTO selectAll(int dim) {
User user=userDao.selectAll(dim);
Map<String,Integer> dim1= new HashMap<>();
Map<String,Integer> filter= new HashMap<>();
dim1.put("dim",user.getDim());
filter.put("filter",user.getFilter());
int featureid=user.getFeatureid();
QueryParam queryParam = new QueryParam(dim1,filter,featureid);
FeatureDTO featureDTO = new FeatureDTO("INTEGER_TYPE",user.getDim()*10,queryParam);
return featureDTO;
}
}
package com.xfgg.demo.service.impl;
import com.xfgg.demo.dao.UserDao;
import com.xfgg.demo.model.entity.User;
import com.xfgg.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public Integer getParams(User user) {
return userDao.getParams(user);
}
}
mapper编写
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.xfgg.demo.dao.UserDao">
<insert id="getParams" parameterType="java.util.List">
insert into
user(dim,filter,featureid)
values
(#{dim},#{filter},#{featureid});
</insert>
<select id="selectAll" parameterType="java.util.List" resultType="com.xfgg.demo.model.entity.User">
select *
from user
where dim=#{dim}
</select>
</mapper>
效果图