利用Redis生成自增序列订单号及解决spring-boot工具类无法自动注入其他类

2,862 阅读1分钟
package io.thanz.util;


import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * 生成订单号
 * 定义订单号规则
 * 下单渠道+业务类型+时间信息+自增
 * 下单渠道:1(根据自己业务设置)
 * 业务类型:1(根据自己业务设置)
 * 时间信息:秒级时间戳,如java的 (System.currentTimeMillis()/1000 + "").substring(1)
 * 自增:3位自增,可采用redis的incr,从redis取到值后对1000取余,如果值不存在初始可设为111
 * 总位数:1位+1位+9位+3位=14位
 *
 * @author fzx
 * @date 2018/11/2
 */
@Component
public class BookingOrderNoCreator {
  @Resource
  private StringRedisTemplate autowireRedisTemplate;

  private static RedisTemplate redisTemplate;

  private static final String CHANNEL = "1";

  private static final String BUSINESSTYPE = "1";


  @PostConstruct
  public void init() {
    redisTemplate = autowireRedisTemplate;
  }

  public static String createBookingOrderNo() {
    StringBuilder bookingOrderNo = new StringBuilder();
    RedisAtomicLong redisAtomicLong = new RedisAtomicLong("bookingOrderNo", redisTemplate.getConnectionFactory());
    Long currentValue = redisAtomicLong.get();
    if (currentValue == 0) {
      redisAtomicLong.set(111L);
    }
    Long incrementValue = redisAtomicLong.incrementAndGet() % 1000;
    bookingOrderNo.append(CHANNEL).append(BUSINESSTYPE).append((System.currentTimeMillis() / 1000 + "").substring(1)).append(incrementValue);
    return bookingOrderNo.toString();
  }


}

      其原因是spring-boot启动时没有扫描到工具类,所以第一步在工具类的class级别加上注释@Component,其后在变量autowireRedisTemplate上加上@Resource自动注入,为了能让static方法能用,再建一个静态变量redisTemplate,用一个@PostConstruct注释的方法将autowireRedisTemplate赋值给redisTemplate(此方法会在项目启动时一同运行),最后,static方法中使用redisTemplate进行业务处理。

      具体无法注入原因我也不是很确定,如果有疑问或者指教请在下方评论,谢谢~