「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
1.IOC容器简介
IoC(控制反转)也称为依赖注入(DI)。这是一个过程,对象仅通过构造函数参数、工厂方法的参数或在对象实例构造或从工厂方法返回后在对象实例上设置的属性来定义它们的依赖关系(即它们使用的其他对象)。然后,容器在创建bean时注入这些依赖项。这个过程基本上是bean本身的逆过程(因此称为控制反转),通过使用类的直接构造或服务定位器模式等机制来控制其依赖项的实例化或位置。
The org.springframework.beans and org.springframework.context packages are the basis for Spring Framework’s IoC container. The BeanFactory interface provides an advanced configuration mechanism capable of managing any type of object. ApplicationContext is a sub-interface of BeanFactory
这是从官网拷贝的,翻译过来就是:
org.springframework.bean和org.springframework.context包是Spring框架的IoC容器的基础。BeanFactory接口提供了一种高级配置机制,能够管理任何类型的对象。ApplicationContext是BeanFactory的子接口。
即 IOC容器主要有两种实现方式,一种是继承了BeanFactory,另一种是继承了ApplicationContext,其中BeanFactory提供了配置框架和基本功能,而ApplicationContext提供了更多更丰富的功能。
2.如何工作
2.1 原理图
从官网的结构图,我们可以很容易看到,容器的本质就是管理业务类,读取配置文件,给我们准备一个生成充分配置的系统
- 这里pojo可以理解成我们的业务类
- metadata 就是我们的配置文件,如xml,配置类等
2.2 ApplicationContext代码分析
我们以前刚学 spring的时候 会经常看到这种代码。
1 | ini复制代码ApplicationContext appContext = new ClassPathXmlApplicationContext("/**/beans.xml"); |
点进ClassPathXmlApplicationContext类,然后打开类的继承关系
我们发现它继承了实现了ApplicationContext接口的类。点进ApplicationContext类发现它又继承了很多接口
1 | kotlin复制代码public interface ApplicationContext extends EnvironmentCapable, |
- EnvironmentCapable :所有Spring应用程序上下文都支持环境,并且主要使用接口用于在接受BeanFactory的框架方法中执行类型检查
- ListableBeanFactory :实现了BeanFactory接口, Listable意思是能出来的,ListableBeanFactory可以枚举它们的所有bean信息,而不用一个个通过bean的名称或类型一个个查找。
- HierarchicalBeanFactory:实现了HierarchicalBeanFactory接口,返回值不考虑层级的信息,只读取当前容器定义的信息
- MessageSource:用于支持信息的国际化和包含参数的信息的替换
- ApplicationEventPublisher:发布事件,即某个事件的发布信息告诉所有监听这个事件的监听器。
- ResourcePatternResolver:解析资源文件的策略的接口,继承ResourceLoader,用于获取Resource
2.3 ClassPathXmlApplicationContext实例化过程
1.根据上面的代码直接点进去 看它的构造器
1 | java复制代码public ClassPathXmlApplicationContext(String configLocation) throws BeansException { |
2.查看refresh()方法,这个是容器初始化的核心方法!
1 | scss复制代码public void refresh() throws BeansException, IllegalStateException { |
2.1 : prepareRefresh()方法解析
1 | kotlin复制代码protected void prepareRefresh() { |
2.2:obtainFreshBeanFactory()
1 | scss复制代码protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { |
- AbstractRefreshableApplicationContext的refreshBeanFactory()方法解析(以它为例)
1 | scss复制代码@Override |
2.getBeanFactory() 默认返回的是DefaultListableBeanFactory类型。
1 | kotlin复制代码@Nullable |
2.3 prepareBeanFactory(beanFactory)
1 | scss复制代码protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { |
肝不动了,今天就先到这,剩下的2.4–2.13方法,我会在后续的文章中继续分析。
本文转载自: 掘金