本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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的创建过程。
- 返回的对象实例
- 返回Bean的类型
- 返回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;
}
}