V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yuan434356430
V2EX  ›  程序员

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

  •  
  •   yuan434356430 · 2020-10-26 14:09:32 +08:00 · 2218 次点击
    这是一个创建于 1523 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    12 条回复    2020-10-26 17:37:27 +08:00
    THESDZ
        1
    THESDZ  
       2020-10-26 14:43:24 +08:00
    可以外部指定顺序吧?
    THESDZ
        2
    THESDZ  
       2020-10-26 14:44:07 +08:00
    @THESDZ 我的意思是,不要局限于 bean 初始化的顺序,可以通过配置文件等外部方式,重新排序
    soulzz
        3
    soulzz  
       2020-10-26 15:03:36 +08:00
    外部配置顺序基本没有问题,毕竟类名不常改
    但是一旦改了,ide 又追踪不到就容易出问题
    soulzz
        4
    soulzz  
       2020-10-26 15:08:22 +08:00
    正常的情况来说还是老老实实的写个 ChannelInitializer
    楼主这套责任链模式的流程处理写完了的话记得回我一下,我也想知道怎么优雅的解决比较好
    yuan434356430
        5
    yuan434356430  
    OP
       2020-10-26 15:10:52 +08:00
    我肯定要使用外部方式排序了,业务需要,存到 Mysql 然后刷到 Redis 缓存,每次都读缓存初始化链
    skypyb
        6
    skypyb  
       2020-10-26 15:19:02 +08:00
    没太看明白, 排序完之后还能动态修改吗? 仅限排序的话实现 InitializingBean, 在 afterPropertiesSet()里边排序就行了
    要能在外部操作动态排序的话, 那责任链上下文肯定得对外暴露调整顺序的 API 才行= =
    tamer
        7
    tamer  
       2020-10-26 15:19:57 +08:00
    有段时间没写这些了, 自定义注解定义 enable,order 放到优先级队列处理?
    haosamax
        8
    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
        9
    THESDZ  
       2020-10-26 15:45:42 +08:00
    @soulzz #3 不见得非是类名,基本名称也可以重新命名.
    Cbdy
        10
    Cbdy  
       2020-10-26 16:16:46 +08:00 via Android
    org.springframework.core.annotation.AnnotationAwareOrderComparator
    Bromine0x23
        11
    Bromine0x23  
       2020-10-26 17:19:29 +08:00
    用 ObjectProvider 获取所有 bean,再进行排序比较好?
    mingmingtiexue
        12
    mingmingtiexue  
       2020-10-26 17:37:27 +08:00
    不知道我有没有理解 你的意思。
    使用 zk, 节点是 需要的 bean 的名字逗号分割,赋给一个变量。
    同时解决了是否用和顺序问题,包含名字就是用, 排序就是 handler 执行顺序。
    不过需要引入 zk 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5108 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 09:37 · PVG 17:37 · LAX 01:37 · JFK 04:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.