什么是IOC
IoC 是 Inversion of Control 的简写,译为“ IoC 容器”,它不是一门技术,而是一种设计思想
Spring 通过 IoC 容器来管理的
IoC 容器管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。
所谓依赖关系是指:现在A对象和B对象,A对象需要使用B对象里面的方法,那么就需要再A里面得到B的对象,如果没有spring,我们需要
new
这个对象,但有spring之后,它的IOC容器会帮助我们去管理这种关系。(依赖注入)
- 我们将由 IoC 容器管理的 Java 对象称为 Spring Bean,它与使用关键字 new 创建的 Java 对象没有任何区别。
IoC的基本过程

编写xml配置文件,这是bean的定义信息
有一个接口
BeanDefinitionReader
,来加载bean的定义信息,加载到IOC容器中public interface BeanDefinitionReader { BeanDefinitionRegistry getRegistry(); @Nullable ResourceLoader getResourceLoader(); @Nullable ClassLoader getBeanClassLoader(); BeanNameGenerator getBeanNameGenerator(); int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException; int loadBeanDefinitions(Resource... resources) throws BeanDefinitionStoreException; int loadBeanDefinitions(String location) throws BeanDefinitionStoreException; int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException; }
将Bean的定义信息加载到IOC容器之后,通过BeanFactory+反射的方式进行实例化,初始化,最终得到Bean对象
我们需要使用的时候需要通过
context.getBean("user")
获取Bean对象
依赖注入
依赖注入DI(Dependency Injection):指Spring创建对象的过程中,将对象依赖属性通过配置进行注入。比如,User有一个Person属性,需要把Person对象注入到User的Person属性里面。
public class User {
private String name;
private Person person;
}
依赖注入常见的实现方式包括两种:set注入和构造注入
依赖注入和IOC的关系:IOC 就是一种控制反转的思想, 而 DI 是对IoC的一种具体实现。
几个接口与实现类的关系

BeanFactory:这是 IoC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用。
ApplicationContext:BeanFactory 的子接口,提供了更多高级特性。面向 Spring 的使用者,几乎所有场合都使用 ApplicationContext 而不是底层的 BeanFactory。
类型名 | 简介 |
---|---|
ClassPathXmlApplicationContext | 通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象 |
FileSystemXmlApplicationContext | 通过文件系统路径读取 XML 格式的配置文件创建 IOC 容器对象 |
ConfigurableApplicationContext | ApplicationContext 的子接口,包含一些扩展方法 refresh() 和 close() ,让 ApplicationContext 具有启动、关闭和刷新上下文的能力。 |
WebApplicationContext | 专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对象,并将对象引入存入 ServletContext 域中。 |
在快速入门的案例中,我们获取Bean是这么写的:
//加载spring配置文件,对象创建
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com