这里说的是spring环境下的.比如提供给用户一个接口. 用户实现了这个接口就用用户的. 没有实现就用框架里自带的
第一种方式
首先参考的是sa-token框架中
/**
* 自定义侦听器的实现
*/
@Component
@Slf4j
public class MySaTokenListener implements SaTokenListener {
}
点进去之后.发现有个set.见下图
这里建议下载框架源码再研究. 刚开始没有下载全.总是找不到入口
/**
* 注入侦听器Bean
*
* @param saTokenListener saTokenListener对象
*/
@Autowired(required = false)
public void setSaTokenListener(SaTokenListener saTokenListener) {
SaManager.setSaTokenListener(saTokenListener);
}
发现是个set注入;
点击去发现有个get
/**
* 侦听器 Bean
*/
private static SaTokenListener saTokenListener;
public static void setSaTokenListener(SaTokenListener saTokenListener) {
SaManager.saTokenListener = saTokenListener;
}
public static SaTokenListener getSaTokenListener() {
if (saTokenListener == null) {
synchronized (SaManager.class) {
if (saTokenListener == null) {
setSaTokenListener(new SaTokenListenerDefaultImpl());
}
}
}
return saTokenListener;
}
所以是先自动注入, get时判断为空就自己new一个.
原来我一直想着自定义的和default的都是自动注入时进行区分的. 原来是有一个先后.
最后再把 SaBeanInject 这个类交给spring进行管理.
框架是通过spring.factories方式;
第二种方式
参考的是TLOG框架
要实现自定义的id
第一步,先继承父类
public class TestIdGenerator extends TLogIdGenerator {
@Override
public String generateTraceId() {
return String.valueOf(System.nanoTime());
}
}
第二步,在配置文件中声明
tlog.id-generator=com.yomahub.tlog.example.dubbo.id.TestIdGenerator
第三步在初始化bean时读取配置
@Override
public void afterPropertiesSet() throws Exception {
if (StrUtil.isNotBlank(idGenerator)){
try{
TLogIdGenerator tLogIdGenerator = (TLogIdGenerator)TLogSpringAware.registerBean(Class.forName(idGenerator));
TLogIdGeneratorLoader.setIdGenerator(tLogIdGenerator);
}catch (Exception e){
throw new RuntimeException("Id生成器包路径不正确");
}
}
}
这样就可以拿到自定义实现
总结
两种方法都可以. 看自己的需求. 如果有其他方法欢迎留言告诉我.我很想知道.谢谢了
顺便贴上两个开源框架的链接:
sa-token:https://sa-token.dev33.cn/doc/index.html#/
tlog:https://tlog.yomahub.com/docs/custom_traceid