Spring 框架的核心容器是 Spring 框架的基础,它负责创建、管理和装配应用程序中的对象。核心容器的主要组件包括 BeanFactory、ApplicationContext 以及相关的 Bean 定义和配置机制,下面详细介绍这些组件及其协同工作方式。

主要组件

1. BeanFactory

  • 作用BeanFactory 是 Spring 框架最底层的接口,它是 Spring IoC 容器的基础实现,提供了基本的对象创建、依赖注入和对象管理功能。
  • 特点:它是一个延迟加载的容器,只有在调用 getBean() 方法获取 Bean 实例时才会创建 Bean 对象。

2. ApplicationContext

  • 作用ApplicationContextBeanFactory 的子接口,它在 BeanFactory 的基础上提供了更多的企业级特性,如国际化支持、事件发布、资源加载等。
  • 特点:它是一个预加载的容器,在容器启动时就会创建所有的单例 Bean 对象。

3. BeanDefinition

  • 作用BeanDefinition 是对 Bean 的定义和描述,它包含了 Bean 的类名、属性、构造函数参数、作用域等信息。Spring 容器根据这些信息来创建和管理 Bean 对象。
  • 特点:它是 Spring 容器创建 Bean 的蓝图,通过 XML 配置文件、Java 注解或 Java 代码等方式来定义。

4. BeanDefinitionRegistry

  • 作用BeanDefinitionRegistry 是一个接口,用于注册和管理 BeanDefinition 对象。BeanFactoryApplicationContext 都实现了该接口,通过它可以动态地注册和移除 BeanDefinition

协同工作方式

Spring 核心容器的主要组件协同工作的过程可以分为以下几个步骤:

1. 配置 Bean 定义

开发者可以通过多种方式配置 BeanDefinition,例如:

  • XML 配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userService" class="com.example.UserService">
        <property name="userRepository" ref="userRepository"/>
    </bean>

    <bean id="userRepository" class="com.example.UserRepository"/>
</beans>
  • Java 注解
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        UserService userService = new UserService();
        userService.setUserRepository(userRepository());
        return userService;
    }

    @Bean
    public UserRepository userRepository() {
        return new UserRepository();
    }
}

2. 加载 Bean 定义

ApplicationContextBeanFactory 会根据配置文件或注解信息,将 BeanDefinition 加载到容器中,并注册到 BeanDefinitionRegistry 中。例如,使用 ClassPathXmlApplicationContext 加载 XML 配置文件:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}

3. 创建和管理 Bean 实例

  • 单例 Bean:对于单例作用域的 Bean,ApplicationContext 在容器启动时会根据 BeanDefinition 创建 Bean 实例,并将其存储在单例 Bean 缓存中。当调用 getBean() 方法获取该 Bean 时,直接从缓存中返回。
  • 原型 Bean:对于原型作用域的 Bean,每次调用 getBean() 方法时,ApplicationContext 都会根据 BeanDefinition 创建一个新的 Bean 实例。

4. 依赖注入

在创建 Bean 实例的过程中,Spring 容器会根据 BeanDefinition 中的依赖信息,将依赖的 Bean 注入到目标 Bean 中。例如,在上面的示例中,UserService 依赖于 UserRepository,Spring 容器会自动将 UserRepository 实例注入到 UserService 中。

5. 提供 Bean 实例

开发者可以通过 ApplicationContextBeanFactorygetBean() 方法获取所需的 Bean 实例,并使用这些实例来完成业务逻辑。

UserService userService = context.getBean("userService", UserService.class);
userService.doSomething();

综上所述,Spring 核心容器的主要组件通过加载和管理 BeanDefinition,创建和管理 Bean 实例,并完成依赖注入,从而实现了对象的创建和管理,为应用程序提供了强大的 IoC 功能。