欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 【Spring IOC】实现一个简单的 Spring 容器

【Spring IOC】实现一个简单的 Spring 容器

2025/2/24 21:37:20 来源:https://blog.csdn.net/ajsbxi/article/details/143450908  浏览:    关键词:【Spring IOC】实现一个简单的 Spring 容器

1. 理解知识

Spring 容器的作用

Spring 容器是Spring的核心,用来管理Bean对象的。容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁。

Bean 对象的管理

当一个 Bean 对象交给 Spring 容器管理时,这个 Bean 对象会被拆解成多个配置项,存储在 Bean 的定义中。

这种拆解操作使得对象更加模块化和解耦,从而更容易被 Spring 容器管理和操作。例如,Spring 容器可以轻松处理循环依赖等问题,确保应用的稳定性和高效性。

2. 设计

在这里插入图片描述

模拟 Spring 容器的设计

在模拟 Spring 框架时,首先需要创建一个 Spring 容器,这是 Spring 框架的核心组件。所有 Bean 都存储在容器内,并通过控制反转(IOC)技术进行管理。

Spring 容器本质上是一个 Bean 工厂(BeanFactory),负责 Bean 的实例化、获取和销毁。ApplicationContext 是 Spring 容器的一个典型实现类,它提供了基本的 Bean 管理功能。

凡是可以存放数据的具体数据结构实现,都可以称之为容器。例如:ArrayList、LinkedList、HashSet等,但在 Spring Bean 容器的场景下,我们需要一种可以用于存放和名称索引式的数据结构,所以选择 HashMap 是最合适不过的。

3. 实现

在这里插入图片描述
BeanDefinition:通常由Spring容器在启动过程中根据配置信息或注解生成,是Sping Ioc容器管理的核心数据结构之一,用于保存Bean的配置和属性
在这里插入图片描述

第一步

创建BeanFactory(Bean工厂)

public class BeanFactory {// 泛型:<String, BeanDefinition> 表示键是 String 类型,值是 BeanDefinition 类型。// ConcurrentHashMap 是线程安全的哈希表实现,用于存储 bean 的定义信息。private Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();public Object getBean(String name) {// 通过 name -> 获取 bean// 这里的get方法是 Map接口提供的,返回的是一个BeanDefinition对象return beanDefinitionMap.get(name).getBean();}// 通过 name 和 BeanDefinition 对象注册public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {beanDefinitionMap.put(name, beanDefinition);}
}

这里get方法是ConcurrentHashMap 内自带的方法,通过键返回值
在这里插入图片描述

创建BeanDefinition( Bean定义)

public class BeanDefinition {// Bean 对象private Object bean;// 初始化Bean并赋值public BeanDefinition(Object bean) {this.bean = bean;}// 获取Beanpublic Object getBean() {return bean;}
}

第二步

创建UserService测试对象

public class UserService {public void queryUserInfo(){System.out.println("查询用户信息");}}

创建测试用例

public class ApiTest {@Testpublic void test_BeanFactory(){// 1.初始化 BeanFactoryBeanFactory beanFactory = new BeanFactory();// 2.注册 bean// 构造方法传入UserService对象BeanDefinition beanDefinition = new BeanDefinition(new UserService());// 通过BeanDefinition的registerBeanDefinition去注册bean // 注意泛型 String,BeandefinitionbeanFactory.registerBeanDefinition("userService", beanDefinition);// 3.获取 beanUserService userService = (UserService) beanFactory.getBean("userService");userService.queryUserInfo();}
}

第三步

运行测试用例

查询用户信息Process finished with exit code 0

总结流程

一个 Spring 容器的注册,归根结底是通过 BeanDefinition 进行注册的,再通过 BeanFactory 进行管理分配,
一个 BeanFactory 可以管理多个 BeanDefinition
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词