【Spring系列-01】Spring容器基本使用及原理

56 阅读3分钟

【Spring系列-01】Spring容器基本使用及原理

一、Spring容器的基础功能概述

Spring容器是Spring框架的核心,它负责创建、管理和维护应用程序中的对象(即bean)。通过Spring容器,我们可以实现对象之间依赖关系的管理、生命周期的控制以及资源的共享等功能,极大地提升了应用程序的可维护性和可扩展性。

二、Spring容器的基本使用

(一)基于XML配置的使用

  1. 定义bean 在Spring的XML配置文件(如applicationContext.xml)中定义bean。例如,定义一个简单的UserService类:
public class UserService {
    public void sayHello() {
        System.out.println("Hello from UserService");
    }
}

applicationContext.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"/>
</beans>

<bean>标签用于定义一个bean,id属性是bean的唯一标识符,在容器中用于获取该bean。class属性指定了bean对应的实际类。

  1. 获取bean并使用 在Java代码中获取并使用这个bean:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = context.getBean("userService", UserService.class);
        userService.sayHello();
    }
}

ClassPathXmlApplicationContext从类路径下加载Spring配置文件,从而创建Spring容器。

context.getBean("userService", UserService.class)通过bean的id从容器中获取对应的bean实例,并将其转换为UserService类型。

(二)基于注解配置的使用

  1. 启用注解扫描 在Spring的配置文件中开启组件扫描:
<context:component - scan base - package="com.example"/>
  1. 定义带注解的bean 使用@Component注解标记UserService类:
import org.springframework.stereotype.Component;

@Component
public class UserService {
    public void sayHello() {
        System.out.println("Hello from UserService");
    }
}
  1. 获取bean并使用(与XML配置方式类似)
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = context.getBean(UserService.class);
        userService.sayHello();
    }
}

@Component注解将类标记为Spring容器中的一个组件,Spring容器在扫描指定包路径时,会自动识别并将其注册为bean。 这里获取bean时,可以直接通过类型获取,因为Spring容器中UserService类型的bean只有一个。

三、Spring容器的原理

(一)BeanDefinition

  1. 概念BeanDefinition是Spring容器中用于描述bean的元数据对象。它包含了bean的类信息、构造函数参数、属性值、作用域等。
  2. 关键属性与方法
    • class属性:指定bean的实际类。
    • scope属性:定义bean的作用域,如单例(singleton)、原型(prototype)等。
    • getBeanClassName()方法:获取bean的类名。

(二)BeanFactory

  1. 核心接口BeanFactory是Spring IoC容器的基础接口,提供了访问容器中bean的基本方法。
  2. 关键方法
    • getBean(String name):根据bean的名称从容器中获取bean实例。
    • containsBean(String name):判断容器中是否包含指定名称的bean。

(三)ApplicationContextApplicationContext

  1. 接口特性ApplicationContext继承自BeanFactory,并扩展了更多功能,如支持国际化、事件发布等。
  2. 实现类:常见的实现类如ClassPathXmlApplicationContext,在创建实例时会加载配置文件并解析其中的BeanDefinition,然后根据这些元数据创建和管理bean。

(四)容器初始化与bean创建流程

  1. 容器初始化
    • 读取Spring配置文件(XML或基于注解扫描)。
    • 解析配置文件,将每个bean的定义转换为BeanDefinition对象,并注册到容器的BeanDefinitionRegistry中。
  2. bean创建
    • 当通过getBean方法请求获取一个bean时,如果该bean尚未创建:
      • 容器根据BeanDefinition中的类信息,使用反射机制创建bean的实例。
      • 对bean进行属性填充,根据BeanDefinition中的属性配置,注入依赖的其他bean。
      • 调用bean的初始化方法(如果定义了初始化方法)。

四、Spring容器原理流程图

image.png