Skip to main content

IoC容器

本篇文章主要是记录一下IoC容器,并基于上篇文章<Spring 系列篇之源码导入>做一些基础测试,文章的主要概念来源于官网。并且所有demo讲解还是基于xml形式,虽然目前绝大多数公司,个人都是采用注解方式。但是为了更好理解,或者追本溯源我们还是先从xml开始练起。

IoC概念#

IoC(Inversion of Control-控制反转)又可以叫 DI(依赖注入-Dependency Injection)。 控制反转:创建对象的主动权交由IoC负责 依赖注入:组件之间的关系也同样交由IoC在运行期注入

在理解此概念之前,我们先回顾一下,我们平时创建一个对象并添加属性的基本步骤。 我们拿最简单的观察者模式来解析 我们来实现一个主题(Subject)中包含多个观察者(Observer)的数据模型,如图: 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)

BeanFactory

ApplicationContext

org.springframework.beansorg.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容器可以帮我们实例化对象,装配属性甚至管理整个生命周期。