2021-02-08实习日报

本文详细介绍Spring中的@Scheduled注解用于定时任务配置,固定率与固定延迟的区别,以及cron表达式的使用。同时深入探讨了@Cacheable注解在缓存管理中的关键属性如value、key和condition的实战示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@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>

效果图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值