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


    前言

    上一次我们在分析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注解的实例化方式,虽然有一定成都额运气成分,不过这也算是意外的收获吧。

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

  • 相关阅读:
    HTML5超科幻个人主页
    用Java开发50个棋类游戏
    Android 4.2 project导入 5.0 SDK Eclipse 开发环境出现的问题总结
    蓝桥杯 地宫寻宝 带缓存的DFS
    HDU2577 How to Type【DP】
    Entity Framework 学习总结之一:ADO.NET 实体框架概述
    ASP.NET MVC4中调用WEB API的四个方法
    ASP.NET MVC Web API 学习笔记---第一个Web API程序
    ASP.Net MVC开发基础学习笔记(1):走向MVC模式
    MVC4笔记 Area区域
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/15329905.html
Copyright © 2020-2023  润新知