千家信息网

Feign中FeignClientFactoryBean的作用是什么

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,今天就跟大家聊聊有关Feign中FeignClientFactoryBean的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。图1其属
千家信息网最后更新 2025年02月01日Feign中FeignClientFactoryBean的作用是什么

今天就跟大家聊聊有关Feign中FeignClientFactoryBean的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

图1

其属性如List-1所示,这些属性的值都是在FeignClientsRegistrar中设置的。

List-1

class FeignClientFactoryBean                implements FactoryBean, InitializingBean, ApplicationContextAware {        /***********************************         * WARNING! Nothing in this class should be @Autowired. It causes NPEs because of some         * lifecycle race condition.         ***********************************/        private Class type;        private String name;        private String url;        private String contextId;        private String path;        private boolean decode404;        private ApplicationContext applicationContext;        private Class fallback = void.class;        private Class fallbackFactory = void.class;...

由于实现了FactoryBean接口,我们来看最重要的getObject()方法,如List-2,getTarget方法中首先从Spring上下文中获取FeignContext。FeignContext是在FeignAutoConfiguration中注册到Spring容器中的,如List-3所示,会将spring容器所有的FeignClientSpecification放入到FeignContext中,FeignClientSpecification在Feign源码分析之EnableFeignClients中讲过,即EnableFeignClients的defaultConfiguration。

List-2

@Overridepublic Object getObject() throws Exception {    return getTarget();} T getTarget() {    FeignContext context = this.applicationContext.getBean(FeignContext.class);    Feign.Builder builder = feign(context);...

List-3

public class FeignAutoConfiguration {        @Autowired(required = false)        private List configurations = new ArrayList<>();        @Bean        public HasFeatures feignFeature() {                return HasFeatures.namedFeature("Feign", Feign.class);        }        @Bean        public FeignContext feignContext() {                FeignContext context = new FeignContext();                context.setConfigurations(this.configurations);                return context;        }...

List-2中,得到FeignContext后,调用feign方法,从FeignContext中获取Encoder、Decoder、Contract,其实内部是从spring容器中获取的,得到Feign.Builder。

我们可以实现RequestInterceptor接口,之后交给Spring容器,feign会自动加上这个拦截器,这个的实现也在FeignClientFactoryBean中,在configureUsingConfiguration方法中,如下List-4

List-4

Map requestInterceptors = context.getInstances(this.contextId, RequestInterceptor.class);if (requestInterceptors != null) {    builder.requestInterceptors(requestInterceptors.values());}

List-4中的context.getInstances()方法内部是如何实现的呢。来看下FeignContext的父类NamedContextFactory,List-5中的setConfigurations方法在List-3中调用,在构造FeignContext的时候调用的。

List-5

public void setConfigurations(List configurations) {    for (C client : configurations) {        this.configurations.put(client.getName(), client);    }}

List-6中

  1. getConext方法获取ApplicationContext,之后从该ApplicationContext中获取bean

  2. getConext方法中,如过name对应的ApplicationContext不存在,则调用createContext方法进行创建

  3. AnnotationConfigApplicationContext.register方法把配置类注册到ApplicationContext中,还设置了AnnotationConfigApplicationContext的parent为当前Spring上下文,这样当在AnnotationConfigApplicationContext中获取不到bean时,就会从父ApplicationContext中获取

List-6

public  T getInstance(String name, Class type) {    AnnotationConfigApplicationContext context = getContext(name);    if (BeanFactoryUtils.beanNamesForTypeIncludingAncestors(context,            type).length > 0) {        return context.getBean(type);    }    return null;}protected AnnotationConfigApplicationContext getContext(String name) {    if (!this.contexts.containsKey(name)) {        synchronized (this.contexts) {            if (!this.contexts.containsKey(name)) {                this.contexts.put(name, createContext(name));            }        }    }    return this.contexts.get(name);}protected AnnotationConfigApplicationContext createContext(String name) {    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();    if (this.configurations.containsKey(name)) {        for (Class configuration : this.configurations.get(name)                .getConfiguration()) {            context.register(configuration);        }    }    for (Map.Entry entry : this.configurations.entrySet()) {        if (entry.getKey().startsWith("default.")) {            for (Class configuration : entry.getValue().getConfiguration()) {                context.register(configuration);            }        }    }    context.register(PropertyPlaceholderAutoConfiguration.class,            this.defaultConfigType);    context.getEnvironment().getPropertySources().addFirst(new MapPropertySource(            this.propertySourceName,            Collections.singletonMap(this.propertyName, name)));    if (this.parent != null) {        // Uses Environment from parent as well as beans        context.setParent(this.parent);        // jdk11 issue        // https://github.com/spring-cloud/spring-cloud-netflix/issues/3101        context.setClassLoader(this.parent.getClassLoader());    }    context.setDisplayName(generateDisplayName(name));    context.refresh();    return context;}

看完上述内容,你们对Feign中FeignClientFactoryBean的作用是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

方法 容器 内容 作用 上下 上下文 属性 接口 是在 重要 时候 更多 源码 知识 篇文章 行业 资讯 资讯频道 频道 中设 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 国家需要网络技术人才吗 华为鲲鹏服务器中标情况 洛阳讯优网络技术电话 以色列的网络安全吗 联想服务器配置管理ip地址 jsp提取数据库信息 武林外传连接服务器 怪鸭乱斗服务器数据错误怎么办 棋牌游戏服务器端架构 微信云开发数据库数据加密 深圳市诚骏网络技术有限公司 信息网络安全高级工程师 c 怎么加载数据库数据 广西网络安全法处罚案例 金蝶erp服务器系统 因特尔浏览器代理服务器怎样打开 打不开网站无法与服务器安全信任 松江区正规数据库服务商服务费 101数据库基础教学 如何定义移动互联软件开发 订做存储服务器机箱上哪找 广州工控网络安全 计算机考试模拟器数据库 mac可以运行数据库吗 潮州专业软件开发维修电话 远程服务器连接错误 软件开发环境包括哪些内容 网络安全承诺书的意义 悉杭州边锋网络技术有限公司 信息网络技术答案
0