我们先了解一下什么是容器,在Java中凡是可以存放数据的具体数据结构的实现都可以称之为容器。像ArrayList、LinkedList、HashSet等。Spring Bean容器也一样,用来存放Spring框架中最基础的Bean对象。
Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种用于承载对象的容器,你可以配置你的每个Bean对象是如何被创建的,这些Bean可以创建一个单独的实例或者每次都需要生成一个新的实例,以及他们之间是如何关联构建和使用的。
如果一个Bean对象交给Spring容器管理,那么这个Bean对象就应该以类似零件的方式被拆解后存放到Bean的定义中,这样相当于一种把对象解耦的擦操作,可以有Spring更加容易的进行统一的管理,就像处理循环依赖等操作。
当一个Bean对象被定义存放之后,再由Spring统一进行装配,这个过程包括Bean的初始化、属性填充等,最终我们就可以完整的使用一个Bean实例化后的对象了。
因为是我们自己为了更好的了解Spring的实现原理,所以我们由浅入深来实现,这里我们只是先最基础的功能。
在Spring Bean容器场景下,我们需要一种可以存放名称索引式结构,所以毫无疑问,HashMap是最合适不过的。
另外,一个简单的Spring Bean容器是西安,还需要Bean的定义、注册、获取三个基本步骤,简单设计如下:
package cn.zrq.springframeowrk;/*** @author zrq* @ClassName BeanDefinition* @date 2023/3/19 21:01* @Description TODO*/
public class BeanDefinition {private Object bean;public BeanDefinition(Object bean) {this.bean = bean;}public Object getBean() {return bean;}public void setBean(Object bean) {this.bean = bean;}
}
目前的 Bean 定义中,只有一个 Object 用于存放 Bean 对象。如果感兴趣可以参考 Spring 源码中这个类的信息,名称都是一样的。
不过在后面陆续的实现中会逐步完善 BeanDefinition 相关属性的填充,例如:SCOPE_SINGLETON、SCOPE_PROTOTYPE、ROLE_APPLICATION、ROLE_SUPPORT、ROLE_INFRASTRUCTURE 以及 Bean Class 信息。
package cn.zrq.springframeowrk;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;/*** @author zrq* @ClassName BeanFactory* @date 2023/3/19 21:02* @Description TODO*/
public class BeanFactory {private Map beanDefinitionMap = new ConcurrentHashMap<>();public Object getBean(String name) {return beanDefinitionMap.get(name).getBean();}public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {beanDefinitionMap.put(name, beanDefinition);}}
package cn.zrq.springframeowrk.test;import cn.zrq.springframeowrk.BeanDefinition;
import cn.zrq.springframeowrk.BeanFactory;
import cn.zrq.springframeowrk.service.UserService;/*** @author zrq* @ClassName ApiTest* @date 2023/3/19 21:12* @Description TODO*/
public class ApiTest {//初始化BeanFactoryprivate static BeanFactory beanFactory = new BeanFactory();private static BeanDefinition beanDefinition = new BeanDefinition(new UserService());public static void main(String[] args) {//注册BeanbeanFactory.registerBeanDefinition("userService",beanDefinition);//获取BeanUserService userService = (UserService)beanFactory.getBean("userService");}
}
成功啦!