spring-boot启动过程实例化补充——关于@Bean

共 1685字,需浏览 4分钟

 ·

2021-09-26 14:39

前言

上一次我们在分析spring boot启动过程实例化方式的时候,关于工厂方法没有做过多说明,一方面是我确实当时不太清楚,另一方面在spring boot的启动流程中,我们并没有找到相关代码,所以最后就一笔带过了。

由于最近这两天把spring boot之前提出的示例demo已经分享完了,最近也正苦于没有学习目标,因此呢,今天我们就来详细看下spring boot的工厂实例化方式。

我们今天不在从启动流程入手,我们换个思路,直接从@Bean注解入手,看下@Bean注解的方法到底是如何被处理的,以及它是何时被处理的。

@Bean注解

首先我搜索了全局有用到Bean.class的地方,找到以下结果:

总共找到10条记录,其中前两条和我们昨天分享的条件配置有关,主要是判断方法是否存在@Bean注解,但是这里并不进行实例化操作,所以我们这里就不深入研究了;

第三行、第四行是获取所有包含@Bean注解的方法的元数据,但是由于这个类是和异常报告相关的(NoSuchBeanDefinitionFailureAnalyzer,从名字可以看出来是个失败分析器,找不到bean的定义信息时触发),所以我们也不做过多说明。不过从调用的方法名来看,这个方法的作用是获取所有的beanMethod

第五行是判断某个方法是否包含@Bean注解:

第六行是获取注解的属性,并从属性中拿到name属性,这个属性最后会变成我们的beanName

第七行是从方法的元数据中获取@Bean注解的属性信息,然后将这些属性信息赋值给bean的定义信息。这个方法很长,信息量也很多,不仅包括了工厂方法的设置,还包括autowireinitMethoddestroyMethod等信息的配置。

然后沿着这个方法我最后进入了refresh方法中,也就是说其实在refresh方法中会调用我们上面这个方法,下面是它的调用流程:

看着这个方法,看着有点眼熟,但是感觉我上次好像没有讲到,然后我又回去翻了下上次源码分享的内容,最终确认这块的内容当时确实没有讲到,当时并没有将这么细。

总体来说,这块的核心代码就是处理bean的定义信息,处理完成后,通过@Bean注解配置的bean的定义信息就会被注册到容器中,然后会在后期实例化的时候,调用bean的工厂方法进行实例化,这种方式就是我们当时没有展开讲的工厂实例方式,这种方式在spring boot中也是广泛存在的,当然关于这一点我也是今天才知道的。

测试

下面我们通过一个@Bean配置实例来看下。首先是我们通过@Bean注解配置的一个过滤器:

然后在一个偶然情况下,我找到了通过工厂方法实例化的方式(我到现在都不知道当时咋发现的,这就是机缘吧),这正是这一发现,我们才有今天的内容,总之就是很偶然。

这是位于SimpleInstantiationStrategy的一个实例化方法,从名字可以看出来,这个类是一种实例化策略,方法的作用就是根据工厂方法实例化对象,从debug截图可以看出来,这里的factoryMethod就是我们加了@Bean注解的方法名,beanName默认就是我们的方法名:

关于这个方法的调用流程,我们后面有机会再讲,今天确实有点太晚了,我们目前只需要搞清楚工厂方法的基本实例化方式就可以了。

总结

今天我们主要围绕着@Bean注解,分析了工厂方法实例化bean的方式和基本流程。

从内容上来讲,其核心就是BeanFactory相关的bean定义信息的设置和赋值,然后就是工厂实例化方式的演示。由于时间的问题,还有一些内容没有分析到,但是目前的内容已经可以让我们比较全面地看到@Bean注解的实例化方式,虽然有一定程度的运气成分,不过这也算是意外的收获吧。

好了,今天的内容就先到这里吧,各位小伙伴,晚安吧!

- END -


浏览 28
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报