Spring 为我们提供了两种核心的容器抽象形式:
- BeanFactory
- ApplicationContext
值得注意的是,这些都是接口,而非具体的实现类。它们代表了容器能力中两个不同的层级。下面让我们来看看 BeanFactory 接口和 ApplicationContext 接口的层级结构,以及它们的一些实现类。
Interface Hierarchy
- BeanFactory 是根接口
- ApplicationContext 继承了 BeanFactory
- XmlBeanFactory 实现了 BeanFactory(已废弃)
- ClassPathXmlApplicationContext、FileSystemXmlApplicationContext 等实现了 ApplicationContext
这也就解释了为什么我们在讨论 Spring 时,总是对比 BeanFactory 和 ApplicationContext 这两个接口,而不是针对具体的实现类进行比较。
1. BeanFactory:
BeanFactory 定义在 org.springframework.beans.factory 包中,它是 Spring 中基础的控制反转容器。它为我们提供了 bean 创建和依赖注入等核心功能。
核心特性:
- 只有在请求时才创建 Bean
- 这种行为被称为延迟初始化
- 适用于轻量级或内存受限的应用程序
声明方式:
ClassPathResource resource = new ClassPathResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(resource);
> 注意:
>
> – INLINECODE0838943eINLINECODEbb3fb9d7
> – 上述示例仅用于演示延迟初始化的行为。
> – BeanFactory 接口本身并未被废弃,但在现代应用程序中很少直接使用。
> – 在实际应用开发中,我们通常优先选择 ApplicationContext。
使用 BeanFactory 的示例(体验延迟初始化)
第 1 步: Bean 类
public class WelcomeBean {
private String name;
public void setName(String name) {
this.name = name;
}
public String welcomeMsg() {
return "Welcome " + name;
}
public void init() {
System.out.println("Welcome Bean is initialized!!");
}
public void destroy() {
System.out.println("Welcome Bean is destroyed!!");
}
}
第 2 步: XML 配置
第 3 步: 测试类
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class WelcomeBeanTest {
public static void main(String[] args) {
ClassPathResource resource = new ClassPathResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(resource);
System.out.println("Before getBean() method");
WelcomeBean bean = (WelcomeBean) factory.getBean("welcomeBean");
System.out.println(bean.welcomeMsg());
factory.destroySingletons();
}
}
输出结果:
解释说明:
- Bean 在容器启动时并未被初始化
- 只有在调用
getBean()方法时,初始化才会发生 - 这种行为正是我们所说的延迟初始化
- XmlBeanFactory 已被废弃,此处仅用于演示目的
功能特性详解
1. BeanFactory 中的自动装配
- 主要依赖基于 XML 的配置
- 支持 autowire 属性
- 默认情况下不启用基于注解的自动装配
2. BeanFactory 中的后置处理器处理
- BeanPostProcessor 和 BeanFactoryPostProcessor 必须手动注册
- BeanFactory 不会自动检测这些后置处理器
3. Bean 初始化示例(延迟初始化)
行为分析:
- 只有当调用
getBean()时,Bean 才会被初始化 - 初始化是按需进行的
执行结果:
- 初始化消息会出现在
getBean()调用之后 - 这证实了延迟初始化的行为模式
2. ApplicationContext:
ApplicationContext 定义在 org.springframework.context 包中,它是一个高级容器,继承自 BeanFactory,并提供了额外的企业级功能。
核心特性:
- 急切实例化(默认行为):容器启动时即创建所有 Bean
- 基于注解的配置支持
- 事件处理机制
- 国际化支持(i18n)
- 自动注册后置处理器
声明方式:
“`java
Applic