请教下 Spring 大佬,如何做指定类型 Bean 的排序和筛选

2020-10-26 14:09:32 +08:00
 yuan434356430

我做了一套责任链模式的流程处理,希望可以自由的控制子类的 Handler 的顺序和是否使用,已经实现是否使用的部分,但顺序仍未实现,且目前的实现方式不够优雅。 我想目前的思路是通过数据库配置 Handler 子类,再判断是否使用,顺序通过 Bean 的命名进行排序 想通过类似 @Order(21)这种方式实现 Bean 的排序。感谢~ 核心代码如下:

2019 次点击
所在节点    程序员
12 条回复
THESDZ
2020-10-26 14:43:24 +08:00
可以外部指定顺序吧?
THESDZ
2020-10-26 14:44:07 +08:00
@THESDZ 我的意思是,不要局限于 bean 初始化的顺序,可以通过配置文件等外部方式,重新排序
soulzz
2020-10-26 15:03:36 +08:00
外部配置顺序基本没有问题,毕竟类名不常改
但是一旦改了,ide 又追踪不到就容易出问题
soulzz
2020-10-26 15:08:22 +08:00
正常的情况来说还是老老实实的写个 ChannelInitializer
楼主这套责任链模式的流程处理写完了的话记得回我一下,我也想知道怎么优雅的解决比较好
yuan434356430
2020-10-26 15:10:52 +08:00
我肯定要使用外部方式排序了,业务需要,存到 Mysql 然后刷到 Redis 缓存,每次都读缓存初始化链
skypyb
2020-10-26 15:19:02 +08:00
没太看明白, 排序完之后还能动态修改吗? 仅限排序的话实现 InitializingBean, 在 afterPropertiesSet()里边排序就行了
要能在外部操作动态排序的话, 那责任链上下文肯定得对外暴露调整顺序的 API 才行= =
tamer
2020-10-26 15:19:57 +08:00
有段时间没写这些了, 自定义注解定义 enable,order 放到优先级队列处理?
haosamax
2020-10-26 15:31:19 +08:00
private static void sortPostProcessors(List<?> postProcessors, ConfigurableListableBeanFactory beanFactory) {
// Nothing to sort?
if (postProcessors.size() <= 1) {
return;
}
Comparator<Object> comparatorToUse = null;
if (beanFactory instanceof DefaultListableBeanFactory) {
comparatorToUse = ((DefaultListableBeanFactory) beanFactory).getDependencyComparator();
}
if (comparatorToUse == null) {
comparatorToUse = OrderComparator.INSTANCE;
}
postProcessors.sort(comparatorToUse);
}
THESDZ
2020-10-26 15:45:42 +08:00
@soulzz #3 不见得非是类名,基本名称也可以重新命名.
Cbdy
2020-10-26 16:16:46 +08:00
org.springframework.core.annotation.AnnotationAwareOrderComparator
Bromine0x23
2020-10-26 17:19:29 +08:00
用 ObjectProvider 获取所有 bean,再进行排序比较好?
mingmingtiexue
2020-10-26 17:37:27 +08:00
不知道我有没有理解 你的意思。
使用 zk, 节点是 需要的 bean 的名字逗号分割,赋给一个变量。
同时解决了是否用和顺序问题,包含名字就是用, 排序就是 handler 执行顺序。
不过需要引入 zk 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/718663

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX