@PostConstruct注解

@PostConstruct注解是Java提供的一个基础注解,该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。

在日常使用中,可以用来初始化可配置字典相关的信息,通过项目启动初始化bean的方式,将需要加载的信息,提前加载到服务器内存,便于后面在程序中使用对应的值。

可以结合ExpiryMap(工具类),设置失效时间,方便及时获取最新的配置内容。

示例:

// 用于存放信息的map
private HashMap<String, Object> infoMap = new hashMap<>();
// 用来判断是否需要重新加载信息的ExpiryMap 时间根据自身需要设置
private ExpiryMap<String, Integer> expMap = new ExpiryMap<>(60*1000);

/**
 * 
 * <p>Description: 根据key获取对应的信息</p>
 * @param tag
 * @return
 */
public xx getInfo(String key) {
    // 验证是否超过重新加载时间,重新拉取最新信息
    expMap.computeIfAbsent("loadName", k -> {
        initInfo();
        return expMap.put(k,1);
    });
    Object info = infoMap.get(key);
    // 根据自身需要,可以加个空值验证,拉取一次最新的信息
    if (null == info) {
        initInfo();
        return infoMap.get(key);
    }
    return info;
}

/**
 * 
 * <p>Description: 加载字典信息</p>
 */
@PostConstruct
public void initInfo() {
    // 接口连接
    String url = "xxx";
    // 调用接口获取字典最新信息
    String str = OKHttpUtil.post(xxx);
    // 返回正常存放信息
    infoMap.pur(xx,xxx);
}

上面示例是简单的思路,具体使用可以根据自身项目的需要进行处理

ExpiryMap

package com.ule.wholesale.common.cache;

import java.util.*;

/**
 * 可以设置有效时间的Map
 * 
 * @param <K>
 * @param <V>
 */
public class ExpiryMap<K, V> extends HashMap<K, V> {

	private static final long serialVersionUID = 1L;
	/**
	 * 默认有效时间一分钟
	 */
	private long expiry = 1000 * 60 * 1L;
	private transient HashMap<K, Long> expiryMapSelf = new HashMap<>();

	public ExpiryMap() {
		super();
	}

	public ExpiryMap(long defaultExpiryTime) {
		this(1 << 4, defaultExpiryTime);
	}

	public ExpiryMap(int initialCapacity, long defaultExpiryTime) {
		super(initialCapacity);
		this.expiry = defaultExpiryTime;
	}

	@Override
	public V put(K key, V value) {
		expiryMapSelf.put(key, System.currentTimeMillis() + expiry);
		return super.put(key, value);
	}
	@Override
	public boolean containsKey(Object key) {
		return !checkExpiry(key, true) && super.containsKey(key);
	}

	/**
	 * expiryTime 键值对有效期 毫秒
	 * 
	 * @param key
	 * @param value
	 * @param expiryTime
	 * @return
	 */
	public V put(K key, V value, long expiryTime) {
		expiryMapSelf.put(key, System.currentTimeMillis() + expiryTime);
		return super.put(key, value);
	}
	@Override
	public int size() {
		return entrySet().size();
	}
	@Override
	public boolean isEmpty() {
		return entrySet() == null || entrySet().isEmpty();
	}
	@Override
	public boolean containsValue(Object value) {
		if (value == null)
			return Boolean.FALSE;
		Set<Entry<K, V>> set = super.entrySet();
		Iterator<Entry<K, V>> iterator = set.iterator();
		while (iterator.hasNext()) {
			Entry<K, V> entry = iterator.next();
			if (value.equals(entry.getValue())) {
				if (checkExpiry(entry.getKey(), false)) {
					iterator.remove();
					return Boolean.FALSE;
				} else {
					return Boolean.TRUE;
				}
			}
		}
		return Boolean.FALSE;
	}
	@Override
	public Collection<V> values() {
		Collection<V> values = super.values();
		if (values == null || values.isEmpty())
			return values;
		Iterator<V> iterator = values.iterator();
		while (iterator.hasNext()) {
			V next = iterator.next();
			if (!containsValue(next))
				iterator.remove();
		}
		return values;
	}
	@Override
	public V get(Object key) {
		if (key == null)
			return null;
		if (checkExpiry(key, true))
			return null;
		return super.get(key);
	}

	/**
	 * @Description: 是否过期
	 * @param key
	 * @return null:不存在或key为null ,-1:过期 ,存在且没过期返回value 因为过期的不是实时删除,所以稍微有点作用
	 */
	public Object isInvalid(Object key) {
		if (key == null)
			return null;
		if (!expiryMapSelf.containsKey(key)) {
			return null;
		}
		long expiryTime = expiryMapSelf.get(key);
		boolean flag = System.currentTimeMillis() > expiryTime;
		if (flag) {
			super.remove(key);
			expiryMapSelf.remove(key);
			return -1;
		}
		return super.get(key);
	}
	@Override
	public void putAll(Map<? extends K, ? extends V> m) {
		for (Entry<? extends K, ? extends V> e : m.entrySet())
			expiryMapSelf.put(e.getKey(), System.currentTimeMillis() + expiry);
		super.putAll(m);
	}
	@Override
	public Set<Entry<K, V>> entrySet() {
		Set<Entry<K, V>> set = super.entrySet();
		Iterator<Entry<K, V>> iterator = set.iterator();
		while (iterator.hasNext()) {
			Entry<K, V> entry = iterator.next();
			if (checkExpiry(entry.getKey(), false))
				iterator.remove();
		}
		return set;
	}

	/**
	 * @Description: 是否过期 
	 * @param isRemoveSuper true super删除
	 * @return
	 */
	private boolean checkExpiry(Object key, boolean isRemoveSuper) {
		if (!expiryMapSelf.containsKey(key)) {
			return Boolean.FALSE;
		}
		long expiryTime = expiryMapSelf.get(key);
		boolean flag = System.currentTimeMillis() > expiryTime;
		if (flag) {
			if (isRemoveSuper)
				super.remove(key);
			expiryMapSelf.remove(key);
		}
		return flag;
	}

	@Override
	public boolean equals(Object o) {
		return super.equals(o);
	}

	@Override
	public int hashCode() {
		return super.hashCode();
	}

	@Override
	public String toString() {
		return super.toString();
	}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值