package com.gcyh.core.base.cache.spring;
import com.gcyh.core.base.log.Log;
import com.gcyh.core.base.log.LogFactory;
import com.gcyh.core.base.utils.ApplicationUtils;
import com.gcyh.core.base.utils.StringBuilderUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.cache.interceptor.SimpleKeyGenerator;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* 键生成器
*
* @author zhengxinghua
*/
@Component
public class BaseKeyGenerator extends SimpleKeyGenerator implements KeyGenerator {
private static Log log = LogFactory.getLog(BaseKeyGenerator.class);
@Override
public Object generate(Object target, Method method, Object... params) {
return getKey(method, params);
}
/**
* @param name 名字
* @param params 参数
* @return 获取键值
*/
public static String getKey(String name, Object... params) {
return getKey(null, null, name, params);
}
/**
* @param isAddApplicationName 是否增加默认
* @param name 名字
* @param params 参数
* @return 获取键值
*/
public static String getKey(boolean isAddApplicationName, String name, Object... params) {
return getKey(null, isAddApplicationName, null, name, params);
}
/**
* @param clazz 调用类
* @param name 名字
* @param params 参数
* @return 获取键值
*/
public static String getKey(Class<?> clazz, String name, Object... params) {
return getKey(null, clazz, name, params);
}
/**
* @param applicationName 应用名
* @param clazz 调用类
* @param name 名字
* @param params 参数
* @return 获取键值
*/
public static String getKey(String applicationName, Class<?> clazz, String name, Object... params) {
return getKey(applicationName, true, clazz, name, params);
}
/**
* @param applicationName 应用名
* @param isAddApplicationName 是否增加默认
* @param clazz 调用类
* @param name 名字
* @param params 参数
* @return 获取键值
*/
public static String getKey(String applicationName, boolean isAddApplicationName, Class<?> clazz, String name, Object... params) {
if (StringUtils.isBlank(applicationName) && isAddApplicationName) {
applicationName = getApplicationName();
}
StringBuilder result = new StringBuilder();
if (StringUtils.isNotBlank(applicationName)) {
result.append(applicationName).append(":");
}
if (clazz != null) {
result.append(clazz.getSimpleName()).append(":");
}
if (StringUtils.isNotBlank(name)) {
result.append(name).append(":");
}
if (result.toString().length() > 0) {
StringBuilderUtils.deleteLastChar(result);
}
if (ArrayUtils.isNotEmpty(params)) {
result.append("[");
for (Object each : params) {
result.append(each.toString()).append(",");
}
StringBuilderUtils.deleteLastChar(result);
result.append("]");
}
if (result.length() == 0) {
log.error("键生成器生成的键值为null");
return null;
}
return result.toString();
}
/**
* @return 应用名
*/
public static String getApplicationName() {
return ApplicationUtils.getSystemCode();
}
private static String getKey(Method method, Object... params) {
Class<?> clazz = method.getDeclaringClass();
return getKey(clazz, method.getName(), params);
}
}