本篇文章主要是记录一下IoC容器,并基于上篇文章<Spring 系列篇之源码导入>做一些基础测试,文章的主要概念来源于官网。并且所有demo讲解还是基于xml
形式,虽然目前绝大多数公司,个人都是采用注解
方式。但是为了更好理解,或者追本溯源我们还是先从xml
开始练起。
1. 概念
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)
BeanFactory
ApplicationContext
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容器可以帮我们实例化对象,装配属性甚至管理整个生命周期。
3. 感谢
感谢各位老铁花时间观看!
欢迎留言指正!
内容持续更新!