千家信息网

Feign中FeignClientFactoryBean的作用是什么

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,今天就跟大家聊聊有关Feign中FeignClientFactoryBean的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。图1其属
千家信息网最后更新 2026年10月31日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安全错误 数据库的锁怎样保障安全 深圳市人人互联网科技有限公司 科技互联网技术 金融科技创新监管互联网金融 互联网公司 科技公司 互联网与新科技 融贸通互联网科技 互联网高科技企业 科技互联网创业计划书 联恩商钥互联网科技有限公司 互联网科技有哪些公司 阿大互联网科技有限公司 翼展科技 首家互联网医院 烟台灵鸽互联网科技有限公司 山东有哪些互联网科技公司 广州百诚互联网科技有限公司官网 互联网金融金融科技 互联网科技大会大佬 北京瑞云互联网科技有限公司 互联网高科技绘画 株洲百竞科技的互联网营销顾问 万易互联网科技 互联网 科技服务平台 玖二柒互联网科技公司待遇 互联网经济与金融科技 武汉健翔互联网络科技有限公司 保险科技服务互联网营销体系 智帮互联网科技公司最近动向 广西泛欧互联网科技有限公司 互联网科技企业文化 小牛互联网科技有限公司地址
0