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设置属性的时候;