入门案例
一个简单的spring工程
概要:使用xml配置方式创建一个对象,并执行其方法
- 创建一个maven工程,指定jdk,spring版本
- 在pom.xml文件中导入spring-context和junit依赖
- 创建一个类路径为com.atli.pojo的User类,并编写hello方法
- 使用
<bean>
标签将user类注册到ioc容器中 - 在test中创建一个测试类并编写测试方法
- 使用
@Test
注解标识测试方法 - 通过ClassPathXmlApplicationContext实现类创建Spring Ioc容器对象
- 通过容器的getBean方法获取user对象
- 调用user对象的hello方法
- 使用
实例
spring工程配置文件
<!-- pom.xml配置文件 -->
<dependencies>
<!-- spring context依赖-->
<!-- 当引入Spring Context依赖之后,表示将Spring的基础依赖都引入了-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.2</version>
</dependency>
<!--junit相关依赖 -->
<!-- 可以使用@Test注解进行测试 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.6.3</version>
</dependency>
</dependencies>
IoC容器配置文件
<!-- bean.xml配置文件 -->
<bean id="user" class="com.atli.spring6.User"></bean>
User类
package com.atli.pojo;
public class User {
public void hello(){
System.out.println("Hello");
}
}
测试类
public class UserTest {
@Test
public void test(){
//加载spring配置文件,对象创建
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
//获取创建的对象
User user = (User) context.getBean("user");
//使用对象调用方法
user.add();
}
}
流程分析
- Spring在启动时通过ApplicationContext接口的实现类(比如ClassPathXmlApplicationContext)来加载配置类或者配置文件
- 当文件加载完成后,Spring利用BeanDefinitionReader接口的实现类(如XmlBeanDefinitionReader)对配置文件进行解析操作,将Bean的定义信息解析成BeanDefinition对象。
- 这些BeanDefinition对象会被注册到DefaultListableBeanFactory内部的beanDefinitionMap中
- 当Spring容器根据解析到的BeanDefinition信息,利用BeanFactory接口及其实现类(如DefaultListableBeanFactory)来实例化Bean对象
- 当Bean对象实例化完成后,Spring会使用AutowiredAnnotationBeanPostProcessor等后置处理器来将Bean所需的依赖注入到Bean中,确保Bean直接按的关系正确建立
- 在Bean实例化完成后,Spring容器会调用@Bean注解的initMethod属性或者是XML配置中指定的init-method来对bean进行初始化(在初始化前后也可以自定义后置处理器逻辑,需要重写BeanPostProcessor中的postProcessBeforeInitialization和postProcessAfterInitialization方法,这些后置处理器会对容器中所有的bean生效,后置处理器也要通过bean标签放入容器中)
- 当需要使用对应bean时,通过getBean方法来获取相应的实例(在懒加载或者是多例模式下,以上对于bean的实例化和初始化动作会在调用getBean方法时才进行)
所提到的类和接口
- application.xml
- 其中配置了要放入ioc容器的bean信息
- ApplicationContext接口
- 它是BeanFactory的子接口,提供了更多的功能
- 负责管理Spring应用中的所有bean
- BeanFactory接口
- 是SpringIoC容器标准化的超接口,它提供了一种高级配置机制,能够管理任何类型的对象
- BeanDefinitionReader接口
- 用于读取和解析Bean定义的信息,然后将这些信息转换为Spring的内部数据结构BeanDefinition
- XmlBeanDefinitionReader类
- 用于读取XML配置文件中Bean定义
- AnnotationBeanDefinitionReader
- 用于扫描注解来注册Bean定义
- BeanDefinition对象
- 其中包含了该Bean的元数据信息,比如类名、作用域、依赖关系等。
- DefaultListableBeanFactory
- 是 BeanFactory 接口的一个默认实现
- 负责管理 Bean 的定义、创建、配置和生命周期
- beanDefinitionMap
- 充当一个注册表的角色,用于存储和管理所有Bean的元数据信息
- 这个Map的键通常是Bean的名称(id或者name),值是对应的BeanDefinition对象。