【Spring系列-01】Spring容器基本使用及原理
一、Spring容器的基础功能概述
Spring容器是Spring框架的核心,它负责创建、管理和维护应用程序中的对象(即bean)。通过Spring容器,我们可以实现对象之间依赖关系的管理、生命周期的控制以及资源的共享等功能,极大地提升了应用程序的可维护性和可扩展性。
二、Spring容器的基本使用
(一)基于XML配置的使用
- 定义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对应的实际类。
- 获取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类型。
(二)基于注解配置的使用
- 启用注解扫描 在Spring的配置文件中开启组件扫描:
<context:component - scan base - package="com.example"/>
- 定义带注解的bean
使用
@Component注解标记UserService类:
import org.springframework.stereotype.Component;
@Component
public class UserService {
public void sayHello() {
System.out.println("Hello from UserService");
}
}
- 获取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
- 概念:
BeanDefinition是Spring容器中用于描述bean的元数据对象。它包含了bean的类信息、构造函数参数、属性值、作用域等。 - 关键属性与方法
- class属性:指定bean的实际类。
- scope属性:定义bean的作用域,如单例(
singleton)、原型(prototype)等。 getBeanClassName()方法:获取bean的类名。
(二)BeanFactory
- 核心接口:
BeanFactory是Spring IoC容器的基础接口,提供了访问容器中bean的基本方法。 - 关键方法
getBean(String name):根据bean的名称从容器中获取bean实例。containsBean(String name):判断容器中是否包含指定名称的bean。
(三)
- 接口特性:
ApplicationContext继承自BeanFactory,并扩展了更多功能,如支持国际化、事件发布等。 - 实现类:常见的实现类如
ClassPathXmlApplicationContext,在创建实例时会加载配置文件并解析其中的BeanDefinition,然后根据这些元数据创建和管理bean。
(四)容器初始化与bean创建流程
- 容器初始化
- 读取Spring配置文件(XML或基于注解扫描)。
- 解析配置文件,将每个bean的定义转换为
BeanDefinition对象,并注册到容器的BeanDefinitionRegistry中。
- bean创建
- 当通过
getBean方法请求获取一个bean时,如果该bean尚未创建:- 容器根据
BeanDefinition中的类信息,使用反射机制创建bean的实例。 - 对bean进行属性填充,根据
BeanDefinition中的属性配置,注入依赖的其他bean。 - 调用bean的初始化方法(如果定义了初始化方法)。
- 容器根据
- 当通过