概述
在微服务spring cloud 当中一般用的都是openfeign作为微服务之间通讯的解决方案,那么我们在在用的时候需要知其然、知其所以然,这样再遇到问题时能想的地方就会更多以便于排查问题、解决问题。在能力允许的情况下尽量做到去看看源码,看是如何实现的、用了那些东西、如何设计的,这对自己也是一个技术上的提升,下面是个人阅读源码时的一些记录.以下内容需要对spring有深入了解阅读过源码的人。
Openfeign如何集成到项目当中就不在赘述了,可以百度搜索如何集成,下面直接进入主题
1. 在使用的时候都是需要在启动类当中或者配置类上面添加@EnableFeignClients开启feign客户端,那么第一步是通过idea查看该类源码
如上图是通过Import使用FeignClientsRegistrar对feign客户端进行注,可以通过idea打开该类后面所讲
2. FeignClientsRegistrar,这个feign客户端注册类,主要是初始化feign默认配置,扫描所有包含FeignClient注解的类,然后在组装FeignClientFactoryBean,通过Spring FactoryBean 的方式创建客户端对象注入到容器当中,以下截图只解释重点部分:
Import的加载的源码查看步骤:
AbstractApplicationContext -> refresh() -> invokeBeanFactoryPostProcessors() ->PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors() 获取所有的BeanFactoryPostProcessor实现类,
在上面所有的BeanFactoryPostProcessor中有一个ConfigurationClassPostProcessor,当中包含了处理@Import注解的类,注入到容器当中,如果Import当中指定的类实现了ImportBeanDefinitionRegistrar的话就会调用到该接口提供的方法,让用户可以自己去定义类然后再注入到容器当中。
3. FeignClientFactoryBean,spring 当中创建客户端的核心类,主要是创建feign客户端代理,以下是截图看源码:
在调用 get(context, Targeter.class),方法时候会通过通过当前feignclient配置的contextId去FeignContext当中获取当前客户端上下文当中的Targeter类,而contextId对应的上下文对象则是AnnotationConfigApplicationContext
有多少个客户端,就有多少个ApplicationContext,通过这个去获取Targeter,这样做可以有效隔离feign当中内部的bean,由于spring容器的父子级关系,内部bean可以获取到我们配置好的bean信息,但是我们没办法获取到feign客户端内部bean的信息,也就是当前启动容器的spring上下文的子容器对象
第一部分就写到这里…
最后
以上就是明亮外套为你收集整理的spring cloud feign源码解读(一)的全部内容,希望文章能够帮你解决spring cloud feign源码解读(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复