博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring IoC的实现原理
阅读量:4584 次
发布时间:2019-06-09

本文共 1750 字,大约阅读时间需要 5 分钟。

spring IoC简介:

IoC:控制反转,所谓控制反转是指:本来被调用者的实例是由调用者来创建的,这样的缺点是耦合性太强,IOC则是统一交给spring来管理创建,将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类。

spring中的IoC容器:

BeanFactory:顶层接口,定义IoC容器基本行为,不会在项目启动的时候就初始化好,而是在当需要使用这个bean的时候,才会去初始化它(xmlBeanFactory)
ApplicationContext:是Spring提供的一个高级的IoC容器,提供高级特性,比如事件发布、国际化信息支持等,在项目启动的时候,默认会加载所有的bean。
 
IoC容器的初始化流程:

1.实现资源文件位置的定位,将定义bean的xml文件封装为Resource来被IOC容器处理,由ResourceLoader接口的实现类处理。

ApplicationContext的所有实现类都实现了RecourceLoader接口,因此可以直接调用getResource(参数)获取Resoure对象

FileSystemXmlApplicationContext.getResource获取的就是FileSystemResource实例;

ClassPathXmlApplicationContext.gerResource获取的就是ClassPathResource实例;

XmlWebApplicationContext.getResource获取的就是ServletContextResource实例;

另外像不需要通过xml直接使用注解@Configuation方式加载资源的AnnotationConfigApplicationContext

2.容器通过BeanDefinitionReader的实现类来完成Resource解析,从而得到Bean的定义信息,这些信息在Spring中使用BeanDefinition对象来表示。

3.BeanDefinition与beanName,Alias一同封装到BeanDefinitionHolder类中,需要把它在IOC容器中注册,由BeanDefinitionRegistry接口的实现类来完成的,注册过程就是在IOC容器内部维护的一个HashMap来保存得到的BeanDefinition的过程。

 

IOC容器的依赖注入:

1.AbstractBeanFactory通过getBean向IoC容器获取被管理的Bean

2.AbstractAutowireCapableBeanFactory的createBean创建Bean实例对象

(1)createBeanInstance()方法

生成Bean的Java的实例对象

SimpleInstantiationStrategy类.它是Spring用来生成Bean对象的默认类,它提供了两种实例化Bean对象的方法

1.如果Bean有方法被覆盖了,通过BeanUtils生成,使用了Java的反射功能

2.通过CGLIB动态代理来生成

(2)populateBean()方法

实现对Bean对象的属性的依赖注入

1.属性值类型不需要转换时,不需要解析属性值,直接准备进行依赖注入

2.属性值需要进行类型转换时,如对其他对象的引用等,首先需要解析属性值,然后使用反射和内省对解析后的属性值进行依赖注入

2.1 BeanDefinitionValueResolver解析属性值:解析引用、数组、list、set、map

2.2 AbstractPropertyAccessor setPropertyValue(具体实现在BeanWrapper实现类中)对Bean属性的依赖注入

 

转载于:https://www.cnblogs.com/a154627/p/10473623.html

你可能感兴趣的文章
webstorm快捷键大全
查看>>
SQL Server 语法大全
查看>>
MySQL存储过程
查看>>
HttpContext是干什么的
查看>>
线程安全
查看>>
原形模式
查看>>
iOS开发笔记5:多线程之NSThread、NSOperation及GCD
查看>>
php中curl的详细解说【转】
查看>>
Codeforces Round #281 (Div. 2) C. Vasya and Basketball 二分
查看>>
hdu 6069 Counting Divisors 筛法
查看>>
codeforces gym 100971 K Palindromization 思路
查看>>
各个控件说明
查看>>
鼠标事件(jQuery)
查看>>
delete指针时coredump的分析之旅
查看>>
openoffice+pdf2swf+FlexPaper在线显示office和pdf
查看>>
24-React Components组件
查看>>
[BZOJ 1188] [HNOI2007] 分裂游戏 【博弈论|SG函数】
查看>>
[BZOJ - 2631] tree 【LCT】
查看>>
ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程...
查看>>
JS实现数组排序:升序和降序
查看>>