Spring5 中更优雅的第三方 Bean 注入

小伙伴们知道,当我们使用 Spring 容器的时候,如果遇到一些特殊的 Bean,一般来说可以通过如下三种方式进行配置:,不过从 Spring5 开始,在 AbstractBeandefinition 类中多了一个属性,对于特殊的 Bean 我们有了更多的选择:,接下来松哥就来和大家简单聊一聊这个话题。,不知道各位小伙伴们有没有用过 OkHttp,这是一个专门做网络请求的工具,在微服务的 HTTP 调用组件中,我们可以配置底层使用 OkHttp 这个工具。,一般来说,如果我们想直接使用 OkHttp,代码如下:,先通过建造者模式创建出来一个 OkHttpClient 对象,然后还是建造者模式创建出来 Request 对象,接下来去发送请求就可以了。那么对于这样的代码,我们可以将 OkHttpClient 对象交由 Spring 容器统一管理,那么该如何将 OkHttpClient 注册到 Spring 容器中呢?,首先可以采用静态工厂方法,也就是工厂方法是一个静态方法,如下:,然后在 Spring 配置文件中进行注入:,静态工厂的特点是静态方法可以直接调用,并必须要获取到工厂类的实例,所以上面配置的时候只需要指定 factory-method 就可以了。,这就可以了,将来我们去 Spring 容器中查找一个名为 httpClient 的对象,拿到手的就是 OkHttpClient 了。,实例工厂方法意思就是说工厂方法是一个实例方法。如下:,这是一个简单的单例模式。但是这里的工厂方法是一个实例方法,实例方法的调用必须得先获取到对象然后才能调用实例方法,因此配置方式如下:,好啦,接下来我们就可以去 Spring 容器中获取一个名为 httpClient 的对象了,拿到手的就是 OkHttpClient 实例。,当然,也可以通过 FactoryBean 来解决上述问题,FactoryBean 松哥在之前的文章中刚刚和大家介绍过,我们来看下:,最后在 Spring 中配置即可:,这个就不做过多解释了,不熟悉的小伙伴可以翻看前面的文章。,上面这三种方案都是传统方案。,特别是前两种,其实我们用的比较少,前两种有一个缺陷,就是我们配置的的 factory-method 都是通过反射来调用的,通过反射调用的话,多多少少性能受点影响。,这种 factory-method 在 Spring 中处理的源码执行时序图如下:,图片图片,所以最终反射是在 SimpleInstantiationStrategy#instantiate 方法中执行的,就是大家非常熟悉的反射代码了:,好了,这是传统的解决方案。,Spring5 中开始提供了 Supplier,可以通过接口回调获取到一个 Bean 的实例,这种方式显然性能更好一些。,如下:,关键就是通过调用 BeanDefinition 的 setInstanceSupplier 方法去设置回调。当然,上面这段代码还可以通过 Lambda 进一步简化:,然后调用这个方法即可:,这是不是更有一点 Lambda 的感觉了~,在 Spring 源码中,处理获取 Bean 实例的时候,有如下一个分支,就是处理 Supplier 这种情况的:,AbstractAutowireCapableBeanFactory#createBeanInstance,上面 obtainFromSupplier 这个方法,最终会调用到第二个方法。第二个方法中的 supplier.get(); 其实最终就调用到我们自己写的 getBook 方法了。

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/29252.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年6月23日
下一篇 2023年7月15日