ApplicationContext 源码
ApplicationContext
是 Spring 框架中的一个重要接口,它是 Spring 应用上下文的顶级接口。
ApplicationContext
提供了以下功能:
-
管理应用程序中的所有 bean,包括它们的生命周期和依赖关系。
-
读取配置文件,并根据配置创建和配置 bean。
-
自动装配 bean 之间的依赖关系。
-
提供事件发布和事件订阅功能。
- 支持国际化。
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
...
}
可以看到,ApplicationContext
接口继承了多个接口,这些接口提供了 ApplicationContext
的各种功能。
例如,
EnvironmentCapable
提供了用于访问和操作应用程序的运行环境,ListableBeanFactory
提供了管理 bean 的功能,HierarchicalBeanFactory
提供了管理 bean 之间的继承关系的功能,MessageSource
提供了国际化消息的功能,ApplicationEventPublisher
提供了事件发布和订阅的功能,ResourcePatternResolver
提供了读取资源文件的功能等。
通过 ApplicationContext
接口,可以方便地访问 Spring 应用上下文的各种功能。
ApplicationContext
的一些重要方法:
-
getBean(String name)
:根据名称获取 bean。 -
getBean(Class<T> requiredType)
:根据类型获取 bean。 -
getBean(String name, Class<T> requiredType)
:根据名称和类型获取 bean。 -
getBeansOfType(Class<T> type)
:根据类型获取所有的 bean。 -
getBeanNamesForType(Class<T> type)
:根据类型获取所有的 bean 的名称。 -
getAutowireCapableBeanFactory()
:获取自动装配 bean 的工厂。 -
getMessage(String code, Object[] args, String defaultMessage, Locale locale)
:根据消息码和国家地区获取消息。 -
getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException
:根据消息码和国家地区获取消息。 -
publishEvent(ApplicationEvent event)
:发布事件。
这些方法是 ApplicationContext
接口中的一些常用方法,它们提供了访问 Spring 应用上下文的各种功能的入口。
常用的 ApplicationContext
实现类:
-
AnnotationConfigApplicationContext
:基于注解的应用上下文,可以通过注解来定义和管理 bean。 -
ClassPathXmlApplicationContext
:基于 XML 配置文件的应用上下文,可以通过 XML 配置文件来定义和管理 bean。 -
FileSystemXmlApplicationContext
:基于 XML 配置文件的应用上下文,可以加载本地文件系统中的 XML 配置文件来定义和管理 bean。 -
WebApplicationContext
:基于 Web 环境的应用上下文,专门用于 Web 应用。
这些 ApplicationContext
实现类都实现了 ApplicationContext
接口,并提供了访问 Spring 应用上下文的各种功能。根据应用的需要,可以选择合适的 ApplicationContext
实现类。
此外,Spring 还提供了一个抽象类 AbstractApplicationContext
,它是 ApplicationContext
接口的一个抽象实现,可以作为其他 ApplicationContext
实现类的基类。
通过 ApplicationContext
和其实现类,可以方便地管理 Spring 应用中的 bean 和它们的依赖关系,并提供了各种功能来支持应用的开发。
通过 ApplicationContext
来管理 bean:
例如,可以通过以下代码来获取 ApplicationContext
对象:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
可以通过以下代码来获取 bean:
MyBean bean = context.getBean("myBean", MyBean.class);
也可以通过以下代码来获取所有的 bean:
Map<String, MyBean> beans = context.getBeansOfType(MyBean.class);
通过 ApplicationContext
来发布和订阅事件:
例如,可以通过以下代码来发布事件:
context.publishEvent(new MyEvent(this));
然后,可以通过以下代码来定义事件监听器:
@Component
public class MyEventListener implements ApplicationListener<MyEvent> {
public void onApplicationEvent(MyEvent event) {
// 处理事件
}
}
当事件发布时,Spring 会自动调用事件监听器的 onApplicationEvent
方法,处理事件。
通过 ApplicationContext
和事件机制,可以在 Spring 应用中实现事件驱动的设计模式,使得应用能够响应外部事件并作出相应的反应。
此外,Spring 还提供了一个抽象类 AbstractApplicationEventMulticaster
,可以作为事件多播器的基类。通过实现这个抽象类,可以自定义事件多播器的实现方式。