IoC的概念
IoC的字面意思就是控制反转,它包括两个“控制”和“反转”。
通俗来说,“控制”就是选择一件东西的控制权,“反转”就是把这种控制权从自己手中移除,交由第三方处理。对于软件来说,即是某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定。同时可以用依赖注入(DI)来代替IoC,即调用类对某一个接口实现类的依赖关系由第三方注入,以移除调用类的某一接口实现类的依赖。
IoC的类型
从注入方法上看,主要可以划分为三种类型:构造函数注入、属性注入、接口注入。Spring支持构造函数注入和属性注入。
Spring BeanFactory容器
BeanFactory是一个类工厂,但和传统的类工厂不同,传统的类工厂仅负责构造一个或几个类的实例,而BeanFactory是类的通用厂,它可以创建并管理各种类的对象。这些可被创建和管理的对象本身没有什么特别之处,仅仅是一个POJO,Spring称这些被创建和管理的Java对象为Bean。Spring为BeanFactory提供了多种实现,最常用的是XmlBeanFactory。BeanFactory接口位于类结构的树顶端,它的最主要方法就是getBean(String beanName),该方法从容器中返回特定名称的Bean。
例子:
使用Spring配置文件为Car提供配置信息,然后通过BeanFactory装载配置文件,启动SpringIoC容器。
XmlBeanFactory通过Resource装载了Spring配置文件并启动了IoC容器,然后就可以通过getBean()的方法获得IoC容器里面的Bean了。通过BeanFactory启动了IoC容器时,并不会初始化配置文件中定义的Bean,直到第一次调用才回进行初始化。对于单实例的Bean来说,BeanFactory会缓存Bean实例,所以第二次使用getBean()获得Bean是会直接再IoC容器的缓存中获得Bean实例。
值得一提,在初始化BeanFactory时,必须为其提供一种日志框架,我们使用log4j.properties,即在类路径下提供此配置文件,Spring容器才不会报错。
运行结果:
Spring ApplicationContext容器
如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的身躯。ApplicationContext是BeanFactory的子接口,也被成为Spring上下文,它提供了更多面向实际应用的功能。ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件。
在获取ApplicationContext实例后,就可以像BeanFactory一样调用getBean(String beanName)返回Bean了。ApplicationContext与BeanFactory的初始化有一个区别:BeanFactory在初始化时并未实例化Bean,直到第一次访问某个Bean时才实例化目标Bean,而ApplicationContext在初始化上下文时就实例化全部单实例的Bean。
例子:
和基于XML文件配置方式的优势在于,类注解的方式可以让开发者很容易控制Bean的初始化过程,比起XML的配置更加灵活。
AnnotationConfigApplicationContext将加载Beans.class中的Bean定义并调用Beans.class中方法实例化的Bean,启动容器并装配Bean。
运行结果: