IoC容器
本篇文章主要是记录一下IoC容器,并基于上篇文章<Spring 系列篇之源码导入>做一些基础测试,文章的主要概念来源于官网。并且所有demo讲解还是基于xml形式,虽然目前绝大多数公司,个人都是采用注解方式。但是为了更好理解,或者追本溯源我们还是先从xml开始练起。
IoC概念#
IoC(Inversion of Control-控制反转)又可以叫DI(依赖注入-Dependency Injection)。 控制反转:创建对象的主动权交由IoC负责 依赖注入:组件之间的关系也同样交由IoC在运行期注入
在理解此概念之前,我们先回顾一下,我们平时创建一个对象并添加属性的基本步骤。
我们拿最简单的观察者模式来解析
我们来实现一个主题(Subject)中包含多个观察者(Observer)的数据模型,如图:

如下就列举了我们平时操作对象的基本步骤
// 创建对象:主动权是开发者Subject subject = new Subject();Observer [] observers = new Observer[]{new Observer()};//属性注入:同样也是开发者在编写代码时set进去的subject.setObservers(observers);可以看到所有对象的创建操作都是老铁们主动new出来的,所有对象属性的赋值也是老铁们主动set进去的。
而spring IoC的概念就是让我们从主动new 的这个动作解放出来的,我们只要定义对应的元数据,以及他们之间的依赖关系,咱们强大的spring IoC就会帮我们做好一切,并将他们存放在一个公共的容器中。
IoC主要组件#
spring-beans(org.springframework.beans)
spring-context(org.springframework.context)
org.springframework.beans和org.springframework.context是IoC容器最基本的包, BeanFactory接口提供了能够管理任何类型对象的高级配置机制,用于访问IoC容器的根接口。ApplicationContext是BeanFactory的子接口,并添加了以下功能
访问应用程序Bean工厂 方法,继承
ListableBeanFactory加载文件资源能力,继承ResourceLoader事件发布能力,继承ApplicationEventPublisher通用消息处理能力,继承MessageSource特定应用程序的上下文,如WebApplicationContext
创建IoC容器#
利用元数据来配置IoC容器
配置元数据的方式有xml beans-annotation-config beans-java
接下来小编会以xml形式初始化IoC容器
用xml创建元数据#
我们还是用上面的主题-观察者模型来做例子
Observer#
public class Observer {}
Subject#
public class Subject { private Observer [] observers;}observer.xml#
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="observer" class="com.lykos.ioc.chapter1.Observer"> </bean></beans>subject.xml#
本身xml是可以定义多个bean的,这里分成多个,目的是使用<import>引入xml文件功能
<bean id="subject" class="com.lykos.ioc.chapter1.Subject"> <property name="observers"> <list> <ref bean="observer"/> </list> </property> </bean> <!--这里使用import导入其它xml配置信息 --> <import resource="observer.xml"></import>启动容器#
public class Chapter1Rocket { public static void main(String[] args) { //这里的构造参数也支持设置多个文件 ApplicationContext ac = new ClassPathXmlApplicationContext("chapter1/subject.xml"); Subject subject = ac.getBean(Subject.class); System.out.println(subject.getObservers()); }}总结#
可以看到这里我们没有自己new 也没有set值。IoC容器可以帮我们实例化对象,装配属性甚至管理整个生命周期。