【问题标题】:How does spring Dispatcher Servlet create default beans without any XML configuration?spring Dispatcher Servlet 如何在没有任何 XML 配置的情况下创建默认 bean?
【发布时间】:2012-07-29 10:08:34
【问题描述】:

Spring Dispatcher Servlet 如何在没有任何预定义 XML 配置文件的情况下创建默认 bean。 (我不是在谈论注释)。

如果我们不给出任何默认值:

1) 处理程序映射对象 2) 多部分解析器 3) 主题解析器等... 在 XML 配置文件中,Spring 会自动创建这些 bean。

当这些 bean 没有在任何地方显式声明时,Spring 如何创建这些 bean? 一旦创建,这些默认 bean 在应用程序上下文中是否可用?我的意思是我们可以通过调用上下文对象的 getBean() 方法来获取这些 bean 吗?

【问题讨论】:

    标签: spring servlets javabeans default dispatcher


    【解决方案1】:

    查看DispatcherServlet.initStrategies():

    protected void initStrategies(ApplicationContext context) {
        initMultipartResolver(context);
        initLocaleResolver(context);
        initThemeResolver(context);
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initHandlerExceptionResolvers(context);
        initRequestToViewNameTranslator(context);
        initViewResolvers(context);
    }
    

    您会注意到DispatcherServlet 尝试查找具有某些固定名称的现有 bean,并且如果未找到则使用默认值或不使用任何名称。

    1) 处理程序映射对象

    如果没有配置其他解析器,则不使用解析器。

    2) 多部分解析器

    查看AnnotationDrivenBeanDefinitionParser.parse() - 相当复杂,请注意。

    3) 主题解析器

    如果没有配置其他解析器,则使用FixedThemeResolver

    Spring MVC 上下文启动的内部结构过于复杂是有原因的——你不应该乱用它们。只需提供要替换的回调或 bean。

    【讨论】:

    • 感谢您的信息。但是如果我们没有指定任何处理程序,我可以看到默认处理程序有一个调用 HandlerMapping hm = context.getBean(HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class)。 getBean() 方法不会创建 bean,它只是从应用程序上下文中获取已创建的 bean 引用,其中所有 bean 都是在上下文启动时创建的。 Spring如何知道必须创建哪个默认处理程序并将其注册到上下文中?
    • @SumitTrehan:查看我的更新。我不确定你问题的第二部分,抱歉。
    • 感谢更新。你能告诉我一本提供 Spring MVC 上下文启动细节的书/链接吗?
    • @SumitTrehan:我认为没有任何资源,因为内部资源一直在不断变化。这里有一些 Spring MVC 开发人员,也许他们可以进一步帮助您?
    【解决方案2】:

    当提到的“init”方法被调用时,默认对象被添加到上下文中。例如,在private void initHandlerMappings(ApplicationContext context) 中,默认的处理程序映射是通过调用getDefaultStrategies(context, HandlerMapping.class) 获得的。在这里,会发生以下情况:

    1. String[] 使用 DispatcherServlet.properties 填充默认类名

    2. 为每个创建一个Class 实例。

    3. 但要实际实例化默认对象,它会调用以下方法,传入类实例:

       protected Object createDefaultStrategy(ApplicationContext context, Class<?> clazz) {
           return context.getAutowireCapableBeanFactory().createBean(clazz);
      

      }

    在这里,默认对象被完全初始化为 bean。

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2014-02-18
      • 1970-01-01
      • 2019-03-24
      • 2018-07-30
      • 2016-01-12
      相关资源
      最近更新 更多