Spring IOC(四)总结升华篇
本系列目录
=============正文分割线==================
Spring 有很多特性,支撑这些特性的是优良的设计思想,IOC(DI)就是其中最典型的控制反转思想,或者叫依赖注入。本系列文章追踪了容器的初始化、以及获取bean的过程。下面总结了几个核心流程图。
1.spring容器中Bean生命周期
2.IOC容器中核心接口
Spring Ioc容器的核心是BeanFactory和BeanDefinition。分别对应对象工厂和依赖配置的概念。虽然我们通常使用的是ApplicationContext的实现类,但ApplicationContext只是封装和扩展了BeanFactory的功能。XML的配置形式只是Spring依赖注入的一种常用形式而已,而AnnotationConfigApplicationContext配合Annotation注解和泛型,早已经提供了更简易的配置方式,AnnotationConfigApplicationContext和AnnotationConfigWebApplicationContext则是实现无XML配置的核心接口,但无论你使用任何配置,最后都会映射到BeanDefinition。
其次,这里特别要注意的还是BeanDefinition, Bean在XML文件里面的展现形式是<bean id="…">…</bean>,当这个节点被加载到内存中,就被抽象为BeanDefinition了,在XML Bean节点中的那些关键字,在BeanDefinition中都有相对应的成员变量。如何把一个XML节点转换成BeanDefinition,这个工作自然是由BeanDefinitionReader来完成的。Spring通过定义BeanDefinition来管理基于Spring的应用中的各种对象以及它们之间的相互依赖关系。BeanDefinition抽象了我们对Bean的定义,是让容器起作用的主要数据类型。我们知道在计算机世界里,所有的功能都是建立在通过数据对现实进行抽象的基础上的。Ioc容器是用BeanDefinition来管理对象依赖关系的,对Ioc容器而言,BeanDefinition就是对控制反转模式中管理的对象依赖关系的数据抽象,也是容器实现控制反转的核心数据结构,有了他们容器才能发挥作用。
3.IOC容器启动流程
不管通过何种渠道定义的bean,xml配置还是注解,最终容器启动时,都会调用AbstractAplicationContext的Refesh()方法,流程图整理如下,可对应第一节中的Bean生命周期图,先beanFactory初始化、后置处理器,再bean后处理器,实例化bean。
4.IOC依赖注入流程
这里的依赖注入就是获取bean时依赖注入相关属性(或者其他bean)。主要是AbstractBeanFactory和AbstractAutoWireCapableBeanFactory.
主要分两步:
1.bean实例化和初始化
2.根据实例化bean获取bean对象。流程图如下:
值得一提的是bean初始化方法:AbstractAutoWireCapableBeanFactory.initializeBean中封装了
1.Aware接口方法:
BeanNameAware:setBeanName
ResourceLoaderAware:setBeanClassLoader
BeanFactoryAware:setBeanFactory
2.BeanPostProcessors: postProcessBeforeInitialization初始化前置处理器
3.InitializingBean:afterPropertiesSet
4.init-method自定义初始化方法
5.BeanPostProcessors :PostProcessorsAfterInitialization初始化后置处理器
这些接口方法全部在bean的生命周期中可以查到。
我们可以对比Bean生命周期图、容器启动流程图、IOC依赖注入流程图,可以发现这三个图,相互印证,互相依存。
精髓思想:
如果说容器就是社会,是有秩序的。容器中的Bean就像社会中的人一样,人生活在社会中,由社会创造人并维护人的生命周期。那么IOC依赖注入就是容器把Bean安插在各个需要的地方,就像是社会把人安排在需要的岗位上去实现自己的价值。
容器、Bean、IOC依赖注入刚好对应社会、人、依存关系。不知道这样讲,大家是否了然了。正所谓大道归一......
Spring IOC(四)总结升华篇的更多相关文章
- 关于Spring IOC (DI-依赖注入)需要知道的一切
关联文章: 关于Spring IOC (DI-依赖注入)你需要知道的一切 关于 Spring AOP (AspectJ) 你该知晓的一切 <Spring入门经典>这本书无论对于初学者或者有 ...
- 关于Spring IOC (DI-依赖注入)
<Spring入门经典>这本书无论对于初学者或者有经验的工程师还是很值一看的,最近花了点时间回顾了Spring的内容,在此顺带记录一下,本篇主要与spring IOC相关 ,这篇博文适合初 ...
- Spring IOC 巨多 非常 有用
关联文章: 关于Spring IOC (DI-依赖注入)你需要知道的一切 关于 Spring AOP (AspectJ) 你该知晓的一切 <Spring入门经典>这本书无论对于初学者或者有 ...
- 关于Spring IOC (DI-依赖注入)你需要知道的一切
<Spring入门经典>这本书无论对于初学者或者有经验的工程师还是很值一看的,最近花了点时间回顾了Spring的内容,在此顺带记录一下,本篇主要与spring IOC相关 ,这篇博文适合初 ...
- Java Spring IOC用法
Java Spring IOC用法 Spring IoC 在前两篇文章中,我们讲了java web环境搭建 和 java web项目搭建,现在看下spring ioc在java中的运用,开发工具为In ...
- Spring之旅第二篇-Spring IOC概念及原理分析
一.IOC概念 上一篇已经了解了spring的相关概念,并且创建了一个Spring项目.spring中有最重要的两个概念:IOC和AOP,我们先从IOC入手. IOC全称Inversion of Co ...
- 转:深入浅出spring IOC中四种依赖注入方式
转:https://blog.csdn.net/u010800201/article/details/72674420 深入浅出spring IOC中四种依赖注入方式 PS:前三种是我转载的,第四种是 ...
- 【Spring IoC】依赖注入DI(四)
平常的Java开发中,程序员在某个类中需要依赖其它类的方法.通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由程 ...
- Spring源码解析 | 第二篇:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析
一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...
随机推荐
- 省市区三级联选select2.js
<div class="mui-input-row row_then" id='showCityPicker3'> <input id='cityResult3' ...
- linux iso 下载地址
Centos 5.3 下载地址: http://www.karan.org/mock/5.3/CentOS-5.3-i386-bin-1to6.torrent http://www.karan.or ...
- 关于Djanggo的环境变量
templates是Django指定的T目录,pycharm下templates的图标会变亮,static则可以改动.下面STATIC_URL可以指定,STATICFILES_DIRS则指定了temp ...
- .net正则IP加端口,并返回IP加端口
public string GetIp(string url) { var reg = new Regex(@"\d{2,3}([.]\d{1,3}){3}:\d{2,5}"); ...
- css绘制内扣圆角
纯静态的一种效果绘制,避免使用图标浪费内存.效果如下 废话不多说,代码如下: <!DOCTYPE html> <html lang="en"> <he ...
- analyse web.xml of hello1
web.xml注释分析: 补充: 一.XML文档的xmlns.xmlns:xsi和xsi:schemaLocation (参考博客:https://www.cnblogs.com/osttwz/p/6 ...
- Spring Security Oauth2 单点登录案例实现和执行流程剖析
Spring Security Oauth2 OAuth是一个关于授权的开放网络标准,在全世界得到的广泛的应用,目前是2.0的版本.OAuth2在“客户端”与“服务提供商”之间,设置了一个授权层(au ...
- 结对作业——WordCount进阶版
Deadline: 2018-10-7 22:00PM,以博客提交至班级博客时间为准 要求参考来自:https://www.cnblogs.com/xinz/archive/2011/11/27/22 ...
- python之二分法查找
二分法查找主要的作用就是查找元素 规则. 掐头结尾取中间, 必须是有序列 # 二分法查找 (需要你明白和掌握) # lst = [1,3,5,7,12,36,68,79] # n = int(inpu ...
- 2.6 利用FTP上传所有文件
利用FTP上传所有文件 import os,ftptools class UploadAll(ftptools.FtpTools): #继承上一篇写的Ftptools '''upload an ent ...