这里是我学习Spirng IOC开始文章,改文章中整合了Spring IOC体系的相关类和接口的源码解析。
Spring IOC学习开始
正文开始
既然介绍这两个接口,自然要知道这两个接口在IOC整个体系中的位置和两者之间的联系。
ApplicationContext定了高级容器的基本规范,其实他也不是直接继承BeanFactory基础容器,可以看到ApplicationContext直接父接口对BeanFactory进行很多拓展其中就包括:
- 事件的注册和发布
- 消息解析
- 资源解析
- Bean工厂层级管理
- 监听器
- 容器环境
通过以上拓展,我们基本可以知道高级IOC容器有哪些特点,这也是学习整个ApplicationContext容器重点了解的部分。
再比较ApplicationContext和ConfigurableApplicationContext定义的方法以及下图层级关系,ConfigurableApplicationContext是ApplicationContext的子接口,也就包含了ApplicationContext。通过方法可以知道,ConfigurableApplicationContext重在对各种属性的配置,而ApplicationContext接口主要各种属性的get方法。
Spring这种将get和set分开到两个接口的设计增大了属性设置和获取的灵活性,将两者分开也更加清晰。在以后的解决方案设计中,可以参考,将配置信息和获取信息分开,两者互不干扰,在保证重要的基础属性不变的情况,可以按需进行拓展。其实Spring的框架设计中应用了大量的装饰者模式,这也是高拓展点的需要
1. ApplicationContext
该类提供了高级IOC规范
其中有几个注意点:
- 从ListableBeanFactory接口继承来的:用于访问应用组件的工厂方法
- 从ResourceLoader接口继承来的:用通用的方式加载文件资源
- 从ApplicationEventPublisher接口继承来的:注册和发布事件
- 从MessageSource接口继承来的:处理消息,支持国际化
从父应用上下文定义的在子上下文中将始终保持优先。
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
/**
* 返回一个唯一的应用上下文id
* @return the unique id of the context, or {@code null} if none
*/
@Nullable
String getId();
/**
* 返回已经部署的该应用上下文的名称.
* @return a name for the deployed application, or the empty String by default
*/
String getApplicationName();
/**
* 返回此上下文友好的名称---这有什么用呢?
* @return a display name for this context (never {@code null})
*/
String getDisplayName();
/**
* 返回该上下文第一次被加载的时间戳
* @return the timestamp (ms) when this context was first loaded
*/
long getStartupDate();
/**
*返回父应用上下文, 如果没有父上下文,该上下文就是在上下文层次的根
* @return the parent context, or {@code null} if there is no parent
*/
@Nullable
ApplicationContext getParent();
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
这其中对AutowireCapableBeanFactory getAutowireCapableBeanFactory()方法有疑惑,然后网上百度了一下。Spring提供了一种机制,能够为第三方框架赋能&