Spring Dispatcher Servlet如何在没有任何预定义XML配置文件的情况下创建默认bean。(我不是在谈论注解)。
如果我们不给出任何默认值:
1)处理程序映射对象2)多部分解析器3)主题解析器等...在XML配置文件中,Spring自动创建这些bean。
当没有显式声明这些bean时,Spring是如何创建这些bean的呢?一旦创建,这些默认bean在应用程序上下文中是否可用?我的意思是,我们可以通过调用上下文对象上的getBean()方法来获得这些mean吗?
发布于 2012-07-29 10:45:51
查看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。
发布于 2018-05-10 21:31:36
当所提到的"init“方法被调用时,默认对象被添加到上下文中。例如,在private void initHandlerMappings(ApplicationContext context)
中,通过调用getDefaultStrategies(context, HandlerMapping.class)
获得默认的处理程序映射。在这里,会发生以下情况:
使用DispatcherServlet.properties
Class
String[]
,但为了实际实例化默认对象,它调用以下方法,传入类实例:protected Object context(ApplicationContext context,Class clazz) {返回context.getAutowireCapableBeanFactory().createBean(clazz);
}
正是在这里,默认对象被完全初始化为bean。
https://stackoverflow.com/questions/11708383
复制相似问题