前言:
👏作者简介:我是笑霸final,一名热爱技术的在校学生。
📝个人主页:个人主页1 || 笑霸final的主页2
📕系列专栏:项目专栏
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏
🔥在这里说一下
参考
作者的博客地址:https://bugstack.cn
作者叫小傅哥
,教程的名字叫《手撸Spring》,也算个版权声明以及宣传吧~
目录
- 一源码目录和类关系
- 二、简单的Bean定义 BeanDefinition
- 三、定义单例注册接口
- 3.1 SingletonBeanRegistry 接口
- 3.2 DefaultSingletonBeanRegistry
- 四、定义Bean 工厂 BeanFactory
- 4.1 抽象类Bean工厂模板AbstractBeanFactory
- 4.2 实例化Bean类(AbstractAutowireCapableBeanFactory)
- 五、DefaultListableBeanFactory核心类实现
- 六、总结
一源码目录和类关系
项目目录
类关系
详细关系图
查看原图===》 点此
接下来 我们就实现上面的类!!!
二、简单的Bean定义 BeanDefinition
BeanDefinition的实现类用于描述Spring中的一个应该被实例化的bean的各种性质,包括bean的属性值,构造函数,方法等等。在容器中,这些Bean的定义用BeanDefinition对象来表示,包含以下元数据: 1. 全限定类名, 通常是Bean的实际实现类; 2. Bean行为配置元素,它们 展开后包含了该bean所具有的各种属性、注入方式、销毁方式等等。
这里我们先实现简单的一个BeanDefinition
public class BeanDefinition {
// 定义成 Class 这样就可以把 Bean 的实例化操作放到容器中处理了。
private Class beanClass;
public BeanDefinition(Class beanClass){
this.beanClass = beanClass;
}
public Class getBeanClass() {
return beanClass;
}
public void setBeanClass(Class beanClass){
this.beanClass = beanClass;
}
}
三、定义单例注册接口
3.1 SingletonBeanRegistry 接口
主要定义了一个获取单例对象
的接口
public interface SingletonBeanRegistry {
//得到 单例bean
Object getSingleton(String beanName);
}
3.2 DefaultSingletonBeanRegistry
实现Object getSingleton(String beanName);的同时 自己还添加addSingleton() 方法
stringObjectMap 用来保存单例对象
public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry {
//容器 存放单例bean
private Map<String,Object> stringObjectMap = new HashMap<>();
@Override
public Object getSingleton(String beanName) {
return stringObjectMap.get(beanName);
}
protected void addSingleton(String beanName , Object singletonObject){
stringObjectMap.put(beanName,singletonObject);
}
}
四、定义Bean 工厂 BeanFactory
public interface BeanFactory {
Object getBean(String name);
}
由 AbstractBeanFactory 抽象类实现接口的 getBean 方法
目前的 BeanFactory 仍然是非常简化的实现、后续笔记会逐步完善此类
4.1 抽象类Bean工厂模板AbstractBeanFactory
AbstractBeanFactory
抽象Bean工厂
此类 继承了DefaultSingletonBeanRegistry
类 此类方法都实现了
实现了BeanFactory
接口 实现getBean()
方法来得到Bean
新增加了BeanDefinition()
和createBean()
两个抽象方法
public abstract class AbstractBeanFactory
extends DefaultSingletonBeanRegistry
implements BeanFactory {
@Override
public Object getBean(String name) {
//调用继承DefaultSingletonBeanRegistry实现的方法
Object bean = getSingleton(name);
if(bean != null){
return bean;
}
BeanDefinition beanDefinition = getBeanDefinition(name);
return createBean(name,beanDefinition);
}
protected abstract BeanDefinition getBeanDefinition(String beanName) ;
protected abstract Object createBean(String beanName, BeanDefinition beanDefinition);
}
getBean(String name):获取单例Bean
当第一次进入此方法 getSingleton(name);返回空 就会跳过 if 方法从而去创建BeanDefinition对象
然后由BeanDefinition的信息来创建Bean对象 当然此类并不实现这两个方法
4.2 实例化Bean类(AbstractAutowireCapableBeanFactory)
AbstractAutowireCapableBeanFactory
抽象自动装配Bean工厂 :创建对象
继承了AbstractBeanFactory
类 并实现 抽象方法createBean()
createBean() 根据beanDefinition
来创建单例对象
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory{
@Override
protected Object createBean(String beanName, BeanDefinition beanDefinition) {
Object bean = null;
try{
bean = beanDefinition.getBeanClass().newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
//此方法是DefaultSingletonBeanRegistry中的 保存单例bean
addSingleton(beanName,bean);
return bean;
}
}
五、DefaultListableBeanFactory核心类实现
实现
BeanDefinitionRegistry
接口中的registerBeanDefinition()
把 一个BeanDefinition 对象保存至容器。
继承AbstractAutowireCapableBeanFactory
类 并实现getBeanDefinition()
此方法是AbstractBeanFactory
中定义的 用来得到一个BeanDefinition
public class DefaultListableBeanFactory
extends AbstractAutowireCapableBeanFactory
implements BeanDefinitionRegistry {
private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();
@Override
protected BeanDefinition getBeanDefinition(String beanName) {
BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);
if (beanDefinition == null) throw new BeansException("No bean named '" + beanName + "' is defined");
return beanDefinition;
}
@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {
beanDefinitionMap.put(beanName, beanDefinition);
}
}
六、总结
先把把 类信息 添加到
BeanDefinition
中
DefaultListableBeanFactory类是核心类 此类把我们的BeanDefinition
注册到BeanDefinition对象池中
然后再 得到Bean对象(根据BeanDefinition的信息来创建bean)
bean对象实在第一次调用getBean()
创建的