Netflix Feign - Spring Cloud 整合 Feign 源码(二)

108 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


3. 注册BeanDefinition

registerFeignClients()

通过构造器模式构造BeanDefiniction,将@FeignClient注解的属性以及center.leon.eurekaconsumerribbonfeignapi.product.server.ProductFacadeServiceFeign相关的东西,都放到BeanDefinition中。

BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(FeignClientFactoryBean.class);

FeignClientFactoryBean,用来创建核心的FeignClient组件的工厂Bean

attributes:@FeignClient的属性。

name:@FeignClient(value = "eureka-provider-ribbon-feign-api-impl"),服务名称

registerFeignClient

AbstractBeanDefinition beanDefinition = definition.getBeanDefinition();

通过构造器模式完成@FeignClient标注的ProductFacadeServiceFeign接口对应的BeanDefinition的构造,beanDefinition包含了@FeignClient注解和ProductFacadeServiceFeign接口相关的所有信息

基于接口类名(className=center.leon.eurekaconsumerribbonfeignapi.product.server.ProductFacadeServiceFeign),别名(alias=eureka-provider-ribbon-feign-api-implFeignClient),beanDefinition

,构造BeanDefinitionHolder。

基于BeanDefinitionRegistry和BeanDefinitionHolder,完成了BeanDefinition的注册。

基于扫描出来的@FeignClient注解和ProductFacadeServiceFeign接口的信息,然后创建实现ProductFacadeServiceFeign接口的动态代理,Feign核心的动态代理,将动态代理作为一个Bean,注入给OrderServiceImpl,然后OrderServiceImpl调用的是Feign的动态代理。。。

FeignClientFactoryBean 创建动态代理

BeanDefinitionBuilder definition = BeanDefinitionBuilder
				.genericBeanDefinition(FeignClientFactoryBean.class);

public static BeanDefinitionBuilder genericBeanDefinition(Class<?> beanClass) {
    BeanDefinitionBuilder builder = new BeanDefinitionBuilder(new GenericBeanDefinition());
    builder.beanDefinition.setBeanClass(beanClass);
    return builder;
}

FeignClientFactoryBean,在Spring容器初始化阶段,根据扫描出来的信息完成ProductFacadeServiceFeign的Feign动态代理的构造。

FeignClientFactoryBean中,保存@FeignClient注解的所有属性的值。因为要根据这些属性的值,来完成Feign动态代理的构造。

FeignClientFactoryBean 实现了 FactoryBean接口,在Spring 容器初始化Bean时,回调FactoryBean.getObject()方法,返回自定义FeignClientFactoryBean构造过程的实例对象。

FactoryBean

FactoryBean是一个工厂Bean,可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程。

  1. 返回的对象实例
  2. 返回Bean的类型
  3. 返回Bean的Scope值
package org.springframework.beans.factory;

import org.springframework.lang.Nullable;


public interface FactoryBean<T> {

	String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";


    // 返回的对象实例
	@Nullable
	T getObject() throws Exception;

    // Bean的类型
	@Nullable
	Class<?> getObjectType();

    // true是单例,false是非单例  在Spring5.0中此方法利用了JDK1.8的新特性变成了default方法,默认返回true
	default boolean isSingleton() {
		return true;
	}

}