如何使用Toothpick注解实现分片级自定义作用域单例?
问题解答
该现象符合预期,原因如下:
- 你调用
supportScopeAnnotation(ShardSingleton::class.java)仅完成了作用域绑定配置:让shard1这类分片作用域可以识别@ShardSingleton注解,将标记了该注解的类归入当前分片作用域的管理范围,但没有将自定义的@ShardSingleton注册为框架认可的单例标识注解。 - 依赖注入框架的内置
@Singleton是默认的单例标记,只有类标记了该注解,框架才会在对应的作用域内做实例缓存,实现单例效果。仅添加@ShardSingleton的情况下,框架只会将类归入对应分片作用域,每次请求实例都会重新创建,因此需要同时搭配@Singleton才能实现分片内单例。
优化方案(仅需@ShardSingleton即可实现分片单例)
你可以在框架全局初始化阶段,将@ShardSingleton注册为官方认可的单例作用域注解,无需再额外添加@Singleton,参考配置如下:
KTP.configure { // 将自定义注解注册为单例标识 addSingletonAnnotation(ShardSingleton::class.java) }
配置完成后,如下声明即可实现对应分片内的单例效果:
@ShardSingleton @InjectConstructor class FooDAO(val dbClient: DBClient)
内容的提问来源于stack exchange,提问作者bfreuden
相关产品推荐
相关产品推荐

