spring--ApplicationContext和BeanFactory的区别(源码)
ApplicationContext 和 BeanFactory 是 Spring 框架中两个核心的接口,它们都用于管理和访问 Spring 容器中的 Bean,但在功能和使用场景上有显著的区别。以下是它们的详细对比,并结合源码进行讲解。
一、 功能对比
特性 | BeanFactory | ApplicationContext |
---|---|---|
Bean 管理 | 支持基本的 Bean 管理和依赖注入。 | 支持 BeanFactory 的所有功能,并扩展了更多特性。 |
事件发布 | 不支持。 | 支持事件发布机制(ApplicationEvent)。 |
国际化支持 | 不支持。 | 支持国际化(MessageSource)。 |
资源访问 | 不支持。 | 支持资源访问(ResourceLoader)。 |
AOP 支持 | 不支持。 | 支持 AOP(面向切面编程)。 |
注解支持 | 不支持。 | 支持注解配置(如 @Component 、@Autowired )。 |
加载时机 | 懒加载(Lazy Loading)。 | 预加载(Eager Loading),启动时初始化所有单例 Bean。 |
使用场景 | 适合资源受限的环境(如移动设备)。 | 适合大多数企业级应用。 |
二、源码讲解
1、BeanFactory源码
BeanFactory是Spring容器的最基本接口,定义了Bean的获取和管理方法
public interface BeanFactory { // 获取 Bean Object getBean(String name) throws BeansException; // 获取指定类型的 Bean <T> T getBean(String name, Class<T> requiredType) throws BeansException; // 判断是否包含指定名称的 Bean boolean containsBean(String name); // 判断 Bean 是否为单例 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; // 判断 Bean 是否为原型 boolean isPrototype(String name) throws NoSuchBeanDefinitionException; // 获取 Bean 的类型 Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 获取 Bean 的别名 String[] getAliases(String name); }
-
特点
-
BeanFactory是一个简单的容器接口,只提供最基本的Bean管理功能
-
默认适用懒加载(Lazy Loading)机制,只有在调用getBean()时才会初始化Bean
-
2、ApplicationContext 源码
ApplicationContext是 BeanFactory 的子接口,扩展了更多功能。
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver { // 获取容器的唯一 ID String getId(); // 获取容器的显示名称 String getDisplayName(); // 获取容器的启动时间 long getStartupDate(); // 获取父容器 ApplicationContext getParent(); // 获取 AutowireCapableBeanFactory AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException; }
-
扩展功能:
-
事件发布
void publishEvent(ApplicationEvent event);
-
支持事情驱动变成,可以通过ApplicationEventPublisher发布事件
-
-
国际化支持
String getMessage(String code, Object[] args, String defaultMessage, Locale locale);
-
支持通过MessageSource实现国际化
-
-
资源访问
Resource[] getResources(String locationPattern) throws IOException;
-
支持通过ResourceLoader访问资源文件
-
-
AOP支持
-
通过集成AOP模块,支持面向切面编程
-
-
注解支持
-
支持通过注解(如@Component、@Autowired)配置Bean
-
-
-
特点:
-
ApplicationContext 是一个高级容器接口,提供了更多企业级功能。
-
默认采用预加载(Eager Loading)机制,启动时初始化所有单例 Bean。
-
三、具体实现类
1、BeanFactory 的实现类
-
DefaultListableBeanFactory
-
是BeanFactory的默认实现类,提供了完整的Bean管理功能
-
源码示例:
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory); reader.loadBeanDefinitions(new ClassPathResource("beans.xml")); MyBean myBean = beanFactory.getBean(MyBean.class);
(这里就是在Resources下beans.xml这个文件,约定大于配置)
-
2、ApplicationContext的实现类
-
ClassPathXmlApplicationContext
-
从类路径加载 XML 配置文件的 ApplicationContext实现。
-
源码示例:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); MyBean myBean = context.getBean(MyBean.class);
-
-
AnnotationConfigApplicationContext
-
基于注解配置的ApplicationContext实现
-
源码示例
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); MyBean myBean = context.getBean(MyBean.class);
AppConfig注解类
-
-
FileSystemXmlApplicationContext
-
用于读取系统文件目中的配置文件
-
四、 使用场景
-
BeanFactory:
-
适合资源受限的环境(如移动设备)。
-
需要手动调用
getBean()
初始化 Bean。
-
-
ApplicationContext:
-
适合大多数企业级应用。
-
提供更多高级功能(如事件发布、国际化、AOP 等)。
-
五、 总结
-
BeanFactory 是 Spring 容器的基础接口,提供最基本的 Bean 管理功能。
-
ApplicationContext 是
BeanFactory
的扩展,提供了更多企业级功能。 -
在实际开发中,通常使用
ApplicationContext
,因为它功能更强大,使用更方便。
通过理解 BeanFactory
和 ApplicationContext
的区别和源码实现,可以更好地掌握 Spring 容器的核心机制。