1

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

如果我们不提供任何默认值:

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

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

4

2 回答 2

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。

于 2012-07-29T10:45:50.840 回答
0

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

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

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

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

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

    }

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

于 2018-05-10T21:31:36.493 回答