首先说下依赖倒置
依赖倒置是种设计原则,把原本的高层建筑依赖底层建筑“倒置”过来,变成底层建筑依赖高层建筑。
比如你要堆个积木,比如一个城堡,看看手里有一些完成的模块,来对城堡,就是城堡在依赖模块。即高层依赖底层。
一旦子模块改变,你就要重新设计城堡了。如果这种层次较多,那修改起来肯定是个噩梦。
而依赖倒置原则,即是根据城堡的设计图,设计子模块,子模块必须根据城堡设计图的要求设计,这样就是底层建筑依赖高层建筑了,也即是依赖倒置了。
IoC 依赖反转,是依赖倒置原则下的一种设计思路,具体的实现方法就是依赖注入。
spring 中的实现
在spring中,IoC实现是通过IoC容器,即BeanFactory。我们经常看到的ApplicationContext 就是BeanFactory的一个子类,而FileSystemXmlApplicationContext,AnnotationConfigApplicationContext,ClassPathXmlApplicationContext又是ApplicationContext的子类。
ClassPathXmlApplicationContext:它是从类的根路径下加载配置文件,推荐使用这种。
FileSystemXmlApplicationContext:它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
AnnotationConfigApplicationContext:当我们使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。
继承图如下:
而以上三个子类会去解析相应的xml文件或注解,将bean信息解析到对应beanDefination中。再根据beanDefination 通过反射生成bean对象,这样在需要用该该bean的地方直接注入即可。
Ioc有什么好处?
不用自己管理对象,拿了就用。
解除高层对底层的依赖,便于维护。
使代码开发更为简单。
易于测试。
易于做aop
等等
高频面试问题:
说一下BeanFactory和ApplicationContext的联系和区别?
通过beanFactory获取实例:
//XmlBeanFactory是典型的BeanFactory。
BeanFactory factory = new XmlBeanFactory("XXX.xml");
//获取一个叫做mdzz的bean。在这个时候进行实例化。
factory.getBean("mdzz");
在beanFactory生成时,并没有初始化bean ,bean初始化延迟到第一次获取。
通过applicationContext获取
//当我们实例化XXX.xml的时候,该文件中配置的bean都会被实例化。(该bean scope是singleton)
ApplicationContext appContext = new ClassPathXmlApplicationContext("XXX.xml");
在singleton scope下,所有bean都会被立即初始化。
所以联系与区别就是
1.ApplicationContext是BeanFactory的子类,拥有丰富的功能,如事件传递,资源访问等。
2.BeanFactory 对bean进行延迟加载,而单例作用域下的Application,对bean进行急切加载。