个人网站企业网站,建投商务网登录,知名网站建设企业,产品设计经典案例ApplicationContext 和 BeanFactory 是 Spring 框架中两个核心的接口#xff0c;它们都用于管理和访问 Spring 容器中的 Bean#xff0c;但在功能和使用场景上有显著的区别。以下是它们的详细对比#xff0c;并结合源码进行讲解。
一、 功能对比
特性BeanFactoryApplicati…ApplicationContext 和 BeanFactory 是 Spring 框架中两个核心的接口它们都用于管理和访问 Spring 容器中的 Bean但在功能和使用场景上有显著的区别。以下是它们的详细对比并结合源码进行讲解。
一、 功能对比
特性BeanFactoryApplicationContextBean 管理支持基本的 Bean 管理和依赖注入。支持 BeanFactory 的所有功能并扩展了更多特性。事件发布不支持。支持事件发布机制ApplicationEvent。国际化支持不支持。支持国际化MessageSource。资源访问不支持。支持资源访问ResourceLoader。AOP 支持不支持。支持 AOP面向切面编程。注解支持不支持。支持注解配置如 Component、Autowired。加载时机懒加载Lazy Loading。预加载Eager Loading启动时初始化所有单例 Bean。使用场景适合资源受限的环境如移动设备。适合大多数企业级应用。
二、源码讲解
1、BeanFactory源码
BeanFactory是Spring容器的最基本接口定义了Bean的获取和管理方法
public interface BeanFactory {// 获取 BeanObject getBean(String name) throws BeansException;
// 获取指定类型的 BeanT T getBean(String name, ClassT requiredType) throws BeansException;
// 判断是否包含指定名称的 Beanboolean 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 {
// 获取容器的唯一 IDString getId();
// 获取容器的显示名称String getDisplayName();
// 获取容器的启动时间long getStartupDate();
// 获取父容器ApplicationContext getParent();
// 获取 AutowireCapableBeanFactoryAutowireCapableBeanFactory 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 容器的核心机制。