IOC(Inverse Of Control 控制反转)是Spring容器的内核,AOP、声明式事务管理等功能都是围绕此展开。
对于软件来说,控制反转即某一接口的具体实现类的控制权从调用者手中转交到第三方手中,由Spring容器借Bean配置来进行控制。
后又因IOC这个概念不够具体,引发业界内广泛的讨论,最后由一位软件界大佬提出了一个新的概念,即DI(Dependency Injection 依赖注入),也就是移除我们对某一实现类的依赖,改由第三方(容器或者协作类)注入,以此降低依赖。
ApplicationContext是BeanFactory的子接口,通常称作Spring上下文。两者都是Spring的核心接口,都可以代表Spring容器,Spring容器是生成Bean实例的工厂,该接口最常用的两个类:ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者是从类路径中加载配置文件,后者是从系统中加载配置文件。
BeanFactory是Spring里面最底层的接口,包含了各种Bean的定义,读取Bean的配置文档,管理Bean的加载,实例化,控制Bean的生命周期,维护Bean之间的依赖关系。
BeanFactory是Spring框架的基础设施,面向Spring本身;
ApplicationContext是面向Spring框架的开发者,几乎所有的开发场合都可以直接使用ApplicationContext而不是底层的BeanFactory。
BeanFactory和ApplicationContext虽说都是Spring容器,但是有明显区别。
·装载Bean的区别
BeanFactory在启动时并不会去加载Bean,只有在getBean的时候才回去加载Bean
ApplicationContext在读取配置文件时会默认初始化所有单例Bean(scope=“singleton”,如果为多例=scope=“prototype”,默认以懒加载的方式),当然可以设置Bean的懒加载Lazy-init,在这一点上ApplicationContext有一个好处是可以提前知道一些问题,而BeanFactory直到getBean时才会发现问题,但较BeanFactory而言,浪费资源。
<bean id="Person" class="demo.Person" lazy-init