【spring】 --- springIOC的一些知识

SpringIOC 

一、IOC和DI,这两个其实是一个概念。

比如说类A要使用B的方法,就需要把B类作为自己的属性,这样耦合度过高,现在只需要将这些对象的创建与销毁交给spring容器来操作,对其进行管理,这样可以在解耦代码的同时提高代码的可测试性。

 

二、常见的IOC的容器:

BeanFactory 和 ApplicationContext

1.BeanFactory

BeanFactory是一个接口,最基本的功能规范,是一个简单的容器;定义了Bean常用的方法getBean,getType,getAlise

 

经常使用DefaultListableBeanFactory,底下有经常用的xmlBeanDefinition,主要可以读取以xml形式定义的BeanDefinition,BeanDefinition是SpringIOC容器中的一种数据结构。

 

2.BeanFactory与FactoryBean

BeanFactory是一个bean工厂,而FactoryBean是一个工厂bean,可以用&FactoryBean获取FactoryBean对象。

 

3.BeanDefinition

BeanDefinition:是对依赖反转模式中管理的对象依赖关系的数据抽象,BeanDefinition就是Spring IOC容器可以识别的数据结构

默认的一个容器为DefaultListableBeanFactory

 

4.BeanFactory<----DefaultListableBeanFactory<----XmlBeanFactory

XmlBeanFactory:可以读取以Xml格式定义的BeanDefinition.

 

5.XmlBeanFactory的编程式实现

①:资源的定位:  

ClassPathResource res = new ClassPathResource();

 

②:创建BeanFactory  

BeanFactory factory = new DefaultListaleBeanFactory();

 

③:创建一个加载类,读取配置文件并注入到BeanFactroy容器.    

Reader reader = new XmlBeanDifinitionReader(factory);  

 

④:加载资源文件将文件转换为BeanDifinition格式

reader.loadBeanDifinition(res);

此时会调用getResourceByPath();

 

6.另一个高级容器ApplictionContext

在BeanFactory的基础上添加了新功能;同时实现了MessageResource这个接口(支持国际化),ResourceReader接口(可以直接访问资源),和ApplicationEventPublisher(可以进行事件机制和Bean的生命周期管理)  

 

7.IOC容器的初始化过程

1.Resource资源的定位过程  

2.载入和解析BeanDefinition  

3.将BeanDefinition注册到IOC容器当中去   

其实注册过程是将一个BeanDefinition注册到hashMap当中去  

 

8.分析我们经常使用的高级容器的初始化过程

ApplicationContext context = new FileSystemApplicationContext("bean.xml");  

①:此过程首先会去调用refresh启动方法  

 

②:此时会调用其几类中的refreshBeanFactory方法,此方法首先会判断有没有BeanFactory容器,有的话首先会将其销毁并关闭;没有的话会去的调用createBeanFactroy方法,此时其实创建的是一个DefaultListableBeanFactory,也就是创建了供当前ApplicationContext使用的一个BeanFactory;

 

此定位过程为BeanDifinition的载入创建了I/O条件

 

③:在refreshBeanFactory中,调用了loadBeanDifinitions(beanFactory);  

getResources();获取资源,此时调用getResourceByPath()方法,此时会将需要的资源new FileSystemResource();

 

④:注册,是将得到的BeanDifinition向IOC容器中BeanDifinitionMap中,实际上是存在一个hashmap中,遇到相同的bean会抛出异常,为了保证数据的一致性,在注册的过程中其实是加了synchronized锁的,将该方法变为了一个同步方法。   

 

 9.IOC容器的依赖注入过程

 

lazy-init:这个属性默认是false,就是在IOC容器的初始化过程中完成。

lazy-init属性设置为true,就是进行懒加载,在IOC容器中得到getBean时,此时就是依赖注入的起点

 

如果向IOC容器索要Bean索取时进行初始化的,其实就是执行getBean()方法时,进行初始化

 

getBean方法执行会去触发 doGetBean方法,此时会去调用createBean方法,此时其实执行的方法是docreateBean方法,

此时里面有两个方法

createBeanInstance:此方法主要是创建Bean对象,

初始化Bean的方法,initiaizaBean:初始化bean,初始化之前首先会先执行BeanName、BeanClassLoder、BeanFactory注入到bean容器中,

执行初始化方法时会执行invokeInitMethod(此时如果配置文件中有init-Method,就会去调用invokeCustomerInitMethod)

 

10.ApplicationContext和Bean的销毁过程

 

doClose(),发出关闭信号,然后将Bean逐个销毁,最后关闭容器自身

 

11.Bean的生命周期

 

①:Bean实例的创建,createBeanInstance

②:在实行initilizaBean(初始化之前)会执行populationBean方法(此方法主要是为创建的bean实例设置属性)

③:调用初始化方法InitilizaBean

④:此时web容器可以通过IOC容器获取Bean并使用

⑤:容器的销毁及Bean对象的销毁

 

12.几种Bean的作用域

①:singleton:单例模式,只能创建一个对象  

②:prototype:每次都会创建一个新的实例,共会创建多个对象实例

③:request:每次http请求中,都会创建一个bean,前提是bena留作一个webXmlAppicationContext  

④:seesion:一个httpsession会话都会创建一个  

⑤:global-seesion:一个全局的session会话

 

13.@AutoWared注解其实是在popularBean方法中实现的,就是为Bean设置属性的时候;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值