SpringIOC知其然

一、SpringIOC的定义

关于SpringIOC的定义,网上应该也是一大堆,无非就是复制粘贴了,我这边也就不长篇累牍的说明;
SpringIOC的核心就在于BeanFactory的容器接口,之前的知识我也只是知道在这一块了,接下来就开始正式学习关于SpringIOC相关的一些底层的知识;

二、DefaultListableBeanFactory与BeanFactory的关系

DefaultListableBeanFactory可以说是IOC容器的始祖,他是BeanFactory接口的实现类,我们可以查看类图;
SpringIOC中DefaultListableBeanFactory的类图
由类图得知,DefaultListableBeanFactory这个类有两个我们认识的大佬,第一位大佬就是BeanFactory,而第二位大佬,很明显就是我们的BeanDefinitionRegistry,这个接口是用来干嘛的呢,我现在还不清楚,接着往下面走;
哦,对了这个主题他们的关系,就由图中得知了,DefaultListableBeanFactory是一个实现类,具体的源码,我就不贴了,继续往下学;

BeanFactory作用

发现不看这个代码是不行了,我就不贴出来了,把中间几个重要的方法看一下
显而易见,我们经常用到的不管是配置文件还是注解的方式注入对象之前,第一步我们就是去getBean,显然,BeanFactory接口已经提供了这个方法;

  Object getBean(String var1) throws BeansException;

  <T> T getBean(String var1, Class<T> var2) throws BeansException;

很显然,BeanFactory的作用就是用来获取我们日常使用的bean的,
既然getBean,那接下来又有一个疑问,从哪里进行set的,回到刚刚的类图,百度一下那个BeanDefinitionRegistry的英文
Bean Definition Registry
bean定义注册表

so?

BeanDefinitionRegistry的作用

渐渐明了,Spring是通过BeanDefinitionRegistry进行注入,BeanDefinitionRegistry这个接口相对于核心的代码如下:

 void registerBeanDefinition(String var1, BeanDefinition var2) throws BeanDefinitionStoreException;

虽然是个4级没过的学渣,但还是看懂了这个方法是干嘛的,明显是注册bean用的,就像如果没猜错,这第一个参数Sring应该是就bean的名称,配置文件和注解的起源

<bean id="var1" />
@Service("var1")
...

应该是这样吧,那现在存在疑问的就是BeanDefinition这个参数是怎么来的
那就看一下这个东西有些什么子类
在这里插入图片描述
咱也不敢问,咱也不敢说,反正我就看到了AbstractBeanDefinition这个,还有一个可疑人员AnnotatedBeanDefinition

AbstractBeanDefinition

在这里插入图片描述
看类图得知,这个玩意是BeanDefinition的抽象类,那么可以说明,AbstractBeanDefinition可能是实现了BeanDefinition里面的方法的,没办法,这还是个抽象类,那我只能找找最终实现类了
兜兜转转找到一个看起来比较靠谱的实现类名字叫做RootBeanDefinition,类图我就不贴了,我不管,反正我看这个RootBeanDefinition的构造方法里面有个比较厉害的东西

public RootBeanDefinition(@Nullable Class<?> beanClass) {
        this.setBeanClass(beanClass);
    }

是的,就是这个,beanClass,我又不是瞎子,自然之道这个beanClass是指的我们要进行注入的类咯;

所以,开干

在SpringBoot的项目中尝试一下
//首先声明并且实例化beanFactory这个工厂类
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();

//用RootBeanDefinition这个类进行实例化
AbstractBeanDefinition beanDefinitionRegistry = new RootBeanDefinition(Date.class);

//毫无疑问的开始注册Bean
//感觉应该XML或者注解的方式都是这么注入的,具体的得学习到后面再啪啪打脸
beanFactory.registerBeanDefinition("date", beanDefinitionRegistry);

//测试一下是不是直接可以拿到Bean
 Date date = (Date) beanFactory.getBean("date");
 
//打印一下时间
 System.out.println(date);

哦豁,竟然真的输出了结果
在这里插入图片描述
好吧,我们现在就已经知其然了,下一篇就学习一下,Spring是怎么从registerBeanDefinitiongetBean这个过程,说到底也就是这一句代码

//这一句
beanFactory.registerBeanDefinition("date", beanDefinitionRegistry);
//或者这一句
Date date = (Date) beanFactory.getBean("date");

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值