Fire Fish 2023-09-25 02:32 采纳率: 0%
浏览 11

如何看待Spring在多处对于容器中的Bean和配置文件中的bean的排序方式不同?

在Spring MVC的DispatcherServlet中初始化特殊的组件。Spring官方对于容器中的特殊组件和从配置文件(DispatcherServlet)加载的特殊组件在【排序方式上】处理不同。

private void initHandlerMappings(ApplicationContext context) {
    this.handlerMappings = null;
 
        Map<String, HandlerMapping> matchingBeans =
            BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);
        if (!matchingBeans.isEmpty()) {
            this.handlerMappings = new ArrayList<>(matchingBeans.values());
            // <1> 从容器中获取的bean就应用了排序规则
            AnnotationAwareOrderComparator.sort(this.handlerMappings);
        }
 
 
    if (this.handlerMappings == null) {
        // <2> 针对从DispatcherServlet.properties加载的配置没有应用排序规则
        this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);
        if (logger.isTraceEnabled()) {
            logger.trace("No HandlerMappings declared for servlet '" + getServletName() +
                         "': using default strategies from DispatcherServlet.properties");
        }
    }
}

问题:针对几个组件是List类型的。如果是从DispatcherServlet.properties默认配置文件加载的则没有应用Ordered接口排序规则,而对于用户自定义注册的组件应用了排序规则,这是否应该认为Spring MVC没有提供统一的排序方式呢?
这是不是Spring的一个缺陷呢。你是如何理解和看待的。

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-25 04:02
    关注

    【以下回答由 GPT 生成】

    问题回答:

    1. 是的,你的理解是正确的。对于用户自定义注册的组件,Spring MVC会应用排序规则,而对于从DispatcherServlet.properties加载的配置不会应用排序规则。

    2. 是的,可以认为这是Spring的一个缺陷。在同一个框架中,不同地方对于同一类型的组件进行排序方式不一致,可能会引发混乱和不一致性。

    3. 对于这个问题,我认为是Spring设计上的一个不一致之处。从代码来看,使用注解或者接口实现排序的方式是比较常见的做法,而采用加载属性文件的方式则没有应用排序规则,这可能是出于设计上的考虑或者历史原因。虽然这可能会导致一些困惑,但在实际使用中,如果需要排序,可以手动对从属性文件中加载的组件进行排序。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 9月25日