【1.0】谈谈spring的启动过程【创建bean和依赖注入ioc的过程分析】

一. spring的启动:

web.xml:

<!-- 加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

从配置文件中,便知道spring在web项目中由监听器ContextLoaderListener加载对应的spring配置文件applicationContext-*.xml完成对spring的启动。

 

推荐博文:Web环境中Spring的启动过程

 

 

二.bean的生成【有xml和组件扫描两种方式】:

例如在spring+springmvc的项目中,往往controller层使用组件扫描,而service层则使用xml配置文件的方式,具体如下:

对于以下需求:

 

controller层(组件扫描):

 

service层(xml配置文件的方式):

 

 

 

以xml为例,分析service层对应bean的生成:

1.service为单例(默认就是单例,并且不适用懒加载):

  在spring启动时便将bean(userService)实例化。实例化过程:spring容器中BeanFactory(bean工厂)根据xml配置文件,获得要实例化的bean的全类名,通过反射生成对应实例。

2.service是单例(但xml配制文件中设置懒加载模式(lazy-init=”true”))或者service为多例(此时懒加载不起作用):只有在getBean或者说使用bean时才实例化。

推荐博文:spring依赖注入的实现原理

 

三. spring ioc依赖注入的过程:

该过程与bean的生成密不可分,当一个bean(UserController对象)被创建时,该bean所拥有的依赖(userService)就要被注入(实例化),依赖注入过程同样是调用BeanFactory,获取所依赖的属性(依赖注入的方式:构造方法,set方式,注解方式等, 获取方法不尽相同),再查找xml配置文件,通过反射实例化对应的依赖,并将实例化后的依赖(userService)封装(反射相关操作)进bean(UserController对象)中,至此,依赖注入完成。

这里补充一个特殊情况【引用自他人博客】:比如Service1引用了Service2,而Service2也引用了Service1。如果现在正在创建Service1,发现它依赖了Service2,在向Service1注入Service2的过程中肯定要先去创建Service2。这时候发现又要创建Service1,当然不能再创建一个Service1了,而是先将未初始化好的Service1引用先注入到Service2中,然后初始化Service2后再回过来注入到Service1中。

推荐博文:SpringIoC依赖注入的过程(三)

   

 

 

 

 

 

 

 

 

 

 

 

 

 

UserController
posted @ 2017-09-01 22:16  chxbar  阅读(3063)  评论(0编辑  收藏  举报