spring框架在什么地方真正实例化了Bean
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这是一个问题,问很多人都不清楚的问题,也许有一部分人知道spring是隐式得调用DefaultLisTableBeanFactory的父类AbstractBeanFactory的
getBean()方法来真正实例化对象的,那么,这个getBean()到底是在什么地方调用的呢?那么,我们就来分析一下吧。
1:基于springMVC框架的项目:
这个就很简单了,我们都知道基于spring的web项目。IOC容器初始化的入口全部在web.xml里面:
org.springframework.web.context.ContextLoaderListener
通过这个ContextLoaderListener,spring完成了BeanDefinition的解析,注册。也就是完成了对XML配置文件的解读,并把所有定义的bean
信息作为spring特有的数据结构存储到了BeanDefinition集合。并将这个集合作为hasMap保存在容器里。并且在这个过程中,建立了web项目的上下
文环境。
接下来,我们看springMvc的容器初始化,他是通过web.xml的这个入口进入的。通过这个DispatcherServlet的入口,spring会再次建立一个上下
文在DispatcherServlet建立起来的上下文之上的。
好了,接下来的事情就很明显了,项目启动起来后,当一个URL请求过来的时候,就会进入 DispatcherServlet,在这个类里面,spring调用了
getBean()方法,对URL请求需要用到的对象,都进行了实例化。
我们可以看看通常我们的一个控制层的配置文件:
"/dtd/spring-beans-2.0.dtd">
class="cn.wadata.hdc.tms.controller.SuggestCompletedController"> class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameReso lver">
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
可以看到,控制层的所有bean定义都是需要被注入到 mbUrlMapping里面的。
我们接下来看看DispatcherServlet。他有很多init方法,其中就有一个initHandlerMappings:
private void initHandlerMappings(ApplicationContext context) {
this.handlerMappings = null;