Spring容器扩展点在微服务中的使用

文章目录

  • 1. Spring扩展点梳理
  • 2.Spring扩展点应用场景
    • 2.1 整合Nacos
      • ApplicationListener扩展场景——监听容器中发布的事件
      • Lifecycle扩展场景——管理具有启动、停止生命周期需求的对象
    • 2.2 整合Ribbon
      • SmartInitializingSingleton扩展场景—— 对容器中的Bean对象进行定制处理
    • 2.3 整合Feign
      • FactoryBean的扩展场景——将接口生成的代理对象交给Spring管理
    • SmartInitializingSingleton&FactoryBean结合场景——根据类型动态装配对象

1. Spring扩展点梳理

  • BeanFactoryPostProcessor
    • BeanDefinitionRegistryPostProcessor bean注册后置处理器
  • BeanPostProcessor
    • InstantiationAwareBeanPostProcessor
    • AbstractAutoProxyCreator
  • @Import
    • ImportBeanDefinitionRegistrar
    • ImportSelector
  • Aware
    • ApplicationContextAware
    • BeanFactoryAware
  • InitializingBean || @PostConstruct
  • FactoryBean
    • mybatis feign 实现
  • SmartInitializingSingleton
  • ApplicationListener
  • Lifecycle
    • SmartLifecycle
    • LifecycleProcessor
  • HandlerInterceptor
    • springmvc拦截器
  • MethodInterceptor
    • 切面中的拦截器

Bean生命周期主线流程:

https://www.processon.com/view/link/5eafa609f346fb177ba8091f

2.Spring扩展点应用场景

2.1 整合Nacos

ApplicationListener扩展场景——监听容器中发布的事件

思考: 为什么整合Nacos注册中心后,服务启动就会自动注册,Nacos是如何实现自动服务注册的?
在这里插入图片描述

NacosAutoServiceRegistration

​ # 对ApplicationListener的扩展 AbstractAutoServiceRegistration#onApplicationEvent # 服务注册 》NacosServiceRegistry#register

​ 监听 WebServerInitializedEvent 这个事件
Spring容器扩展点在微服务中的使用_第1张图片

Lifecycle扩展场景——管理具有启动、停止生命周期需求的对象

介绍: https://www.jianshu.com/p/7b8f2a97c8f5

NacosWatch

​ #对SmartLifecycle的扩展 NacosWatch#start #订阅服务接收实例更改的事件 》NamingService#subscribe


Spring容器扩展点在微服务中的使用_第2张图片

扩展: Eureka Server端上下文的初始化是在SmartLifecycle#start中实现的

EurekaServerInitializerConfiguration

Spring容器扩展点在微服务中的使用_第3张图片

Eureka Server源码分析:

Spring容器扩展点在微服务中的使用_第4张图片

2.2 整合Ribbon

SmartInitializingSingleton扩展场景—— 对容器中的Bean对象进行定制处理

思考:为什么@Bean修饰的RestTemplate加上@LoadBalanced就能实现负载均衡功能?

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

LoadBalancerAutoConfiguration

对SmartInitializingSingleton的扩展,为所有用@LoadBalanced修饰的restTemplate(利用了@Qualifier)绑定实现了负载均衡逻辑的拦截器LoadBalancerInterceptor

Spring容器扩展点在微服务中的使用_第5张图片

LoadBalancerInterceptor

Spring容器扩展点在微服务中的使用_第6张图片

Spring容器扩展点在微服务中的使用_第7张图片

2.3 整合Feign

FactoryBean的扩展场景——将接口生成的代理对象交给Spring管理

思考:为什么Feign接口可以通过@Autowired直接注入使用?Feign接口是如何交给Spring管理的?

     @FeignClient(value = "mall-order",path = "/order")
public interface OrderFeignService {

    @RequestMapping("/findOrderByUserId/{userId}")
    R findOrderByUserId(@PathVariable("userId") Integer userId);
}

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    OrderFeignService orderFeignService;

    @RequestMapping(value = "/findOrderByUserId/{id}")
    public R  findOrderByUserId(@PathVariable("id") Integer id) {
        //feign调用
        R result = orderFeignService.findOrderByUserId(id);
        return result;
    }
}  

FeignClientsRegistrar

Spring容器扩展点在微服务中的使用_第8张图片

FeignClientFactorybean

Spring容器扩展点在微服务中的使用_第9张图片

Spring容器扩展点在微服务中的使用_第10张图片

SmartInitializingSingleton&FactoryBean结合场景——根据类型动态装配对象

SentinelDataSourceHandler

#Sentinel持久化读数据源设计,利用了SmartInitializingSingleton扩展点
SentinelDataSourceHandler#afterSingletonsInstantiated
# 注册一个FactoryBean类型的数据源 
》SentinelDataSourceHandler#registerBean 注册bean定义,通过beanFactory.getBean创建bean
》》NacosDataSourceFactoryBean#getObject
# 利用FactoryBean获取到读数据源
》》new NacosDataSource(properties, groupId, dataId, converter)

Spring容器扩展点在微服务中的使用_第11张图片

NacosDataSourceFactoryBean
Spring容器扩展点在微服务中的使用_第12张图片

Spring容器扩展点在微服务中的使用_第13张图片

Spring容器扩展点在微服务中的使用_第14张图片

在这里插入图片描述

Spring容器扩展点在微服务中的使用_第15张图片

Spring容器扩展点在微服务中的使用_第16张图片

Spring容器扩展点在微服务中的使用_第17张图片

在这里插入图片描述

你可能感兴趣的:(spring,spring)