请教下 Spring 大佬,如何做指定类型 Bean 的排序和筛选 - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
yuan434356430

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

  •  
  •   yuan434356430 Oct 26, 2020 3055 views
    This topic created in 2024 days ago, the information mentioned may be changed or developed.

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

    12 replies    2020-10-26 17:37:27 +08:00
    THESDZ
        1
    THESDZ  
       Oct 26, 2020
    可以外部指定顺序吧?
    THESDZ
        2
    THESDZ  
       Oct 26, 2020
    @THESDZ 我的意思是,不要局限于 bean 初始化的顺序,可以通过配置文件等外部方式,重新排序
    soulzz
        3
    soulzz  
       Oct 26, 2020
    外部配置顺序基本没有问题,毕竟类名不常改
    但是一旦改了,ide 又追踪不到就容易出问题
    soulzz
        4
    soulzz  
       Oct 26, 2020
    正常的情况来说还是老老实实的写个 ChannelInitializer
    楼主这套责任链模式的流程处理写完了的话记得回我一下,我也想知道怎么优雅的解决比较好
    yuan434356430
        5
    yuan434356430  
    OP
       Oct 26, 2020
    我肯定要使用外部方式排序了,业务需要,存到 Mysql 然后刷到 Redis 缓存,每次都读缓存初始化链
    skypyb
        6
    skypyb  
       Oct 26, 2020
    没太看明白, 排序完之后还能动态修改吗? 仅限排序的话实现 InitializingBean, 在 afterPropertiesSet()里边排序就行了
    要能在外部操作动态排序的话, 那责任链上下文肯定得对外暴露调整顺序的 API 才行= =
    tamer
        7
    tamer  
       Oct 26, 2020
    有段时间没写这些了, 自定义注解定义 enable,order 放到优先级队列处理?
    haosamax
        8
    haosamax  
       Oct 26, 2020
    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  
       Oct 26, 2020
    @soulzz #3 不见得非是类名,基本名称也可以重新命名.
    Cbdy
        10
    Cbdy  
       Oct 26, 2020 via Android
    org.springframework.core.annotation.AnnotationAwareOrderComparator
    Bromine0x23
        11
    Bromine0x23  
       Oct 26, 2020
    用 ObjectProvider 获取所有 bean,再进行排序比较好?
    mingmingtiexue
        12
    mingmingtiexue  
       Oct 26, 2020
    不知道我有没有理解 你的意思。
    使用 zk, 节点是 需要的 bean 的名字逗号分割,赋给一个变量。
    同时解决了是否用和顺序问题,包含名字就是用, 排序就是 handler 执行顺序。
    不过需要引入 zk 。
    About     Help     Advertise     Blog     API     FAQ     Solana     5688 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 67ms UTC 03:29 PVG 11:29 LAX 20:29 JFK 23:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86