1、IOC是什么?
答:IOC-Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。
2、谁控制谁?控制什么?
答: IOC 容器控制依赖对象。控制资源的获取。
3、反转是什么?反转了什么内容或关系?
答:对依赖关系的反转。在程序中我们主动new一个对象主动的去获取依赖对象,这叫做(正转)。反转就是把主动获取依赖对象方式,转到IOC容器中,交给IOC容器管理,并由IOC容器完成对象的注入。对象是被动的接受依赖关系。所以是反转。
图解主动依赖和反转后的差别
1.主动控制对象
2.控制反转以后
4、IOC(控制反转)能做什么?
答:把程序中的对象依赖关系转移到配置文件,降低程序耦合。提高代码复用率。
把对象作为bean。由ioc注入数据。即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。
5、DI是什么?
答:DI(依赖注入)就是通过baen注入对象,是IOC的另一个说法。
谁依赖于谁:应用程序依赖于IoC容器;
为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
谁注入谁:IoC容器注入应用程序某个对象,应用程序依赖的对象;
注入了什么:注入某个对象所需要的外部资源(包括对象、资源、常量数据)。
6、IOC容器的初始化过程
1.resource定位(资源定位),既beanDeefinition的资源定位(beanDeefinition baen定义)。就是对baen的定位。
2.对beanDeefinition的载入,就是吧baen转换为ioc内部的数据结构。
3.向IOC容易注册bean。让ioc容易持有bean 或者pojo。
4.IOC容器初始化过程的时候,一般不会对bean进行依赖注入。
5.容器初始化和依赖注入是独立的过程。依赖注入一般在程序第一次getbean的时候才
会触发。或者bean设置lazy-init=true属性。
6.bean为单例,(非(scope = prototype)多例模式)的时候在启动的时候就会初始化。
7.beanfactory factorybean的区别
BeanFacotry是一个类工厂,使用它来创建各种类型的Bean,最主要的方法就是getBean(String beanName),该方法从容器中返回特定名称的Bean,只不过其中有一种Bean是FacotryBean.
一个Bean 要想成为FacotryBean,必须实现FactoryBean 这个接口。
FactoryBean定义了三个接口方法:
1、Object getObject():返回由FactoryBean创建的Bean的实例,如果isSingleton()方法返回true,是单例的实例,该实例将放入Spring的缓冲池中;
2、boolean isSingleton*():确定由FactoryBean创建的Bean的作用域是singleton还是prototype;
3、getObjectType():返回FactoryBean创建的Bean的类型。
FactoryBean 是一直特殊的bean,它实际上也是一个工厂,我们在通过FactoryBeanName得到的Bean,是FacotryBean创建的Bean,即它通过getObject()创建的Bean.我们要想得到FactoryBean本身,必须通过&FactoryBeanName得到,即在BeanFactory中通过getBean(&FactoryBeanName)来得到 FactoryBean
注:在spring 中是通过BeanFactoryUtils.isFactoryDereference()来判断一个Bean是否是FactoryBean.
spring 内部实现中应该是在通过BeanFacotry 的getBean(String beanName) 来得到Bean时,如果这个Bean是一个FactoryBean,则把它生成的Bean返回,否者直接返回Bean.