Spring扩展点在微服务的应用

Spring重要扩展点1

  • BeanFactoryPostProcessor
    • BeanDefinitionRegistryPostProcessor bean定义注册
  • BeanPostProcessor
    • InstantiationAwareBeanPostProcessor
    • AbstractAutoProxyCreator
  • **@Import **
    • ImportBeanDefinitionRegistrar
    • ImportSelector
  • Aware
    • ApplicationContextAware 上下文
    • BeanFactoryAware
  • InitializingBean || @PostConstruct
  • FactoryBean //mybatis 通过getobject方法返回定制的bean,通常结合bean定义的注册器,注册一个FactoryBean ,然后生产不同对象
  • SmartInitializingSingleton //初始化所有的非懒加载后
  • ApplicationListener //时间监听,起一些服务
  • Lifecycle //生命周期
    • SmartLifecycle
    • LifecycleProcessor
  • HandlerInterceptor //mvc的拦截器
  • MethodInterceptor //方法拦截器 aop

IoC工作原理
https://www.processon.com/view/link/5cd10507e4b085d010929d02
image.png
Bean生命周期主线流程:
https://www.processon.com/view/link/5eafa609f346fb177ba8091f
ioc.png

应用场景

ApplicationRunner/CommandLineRunner

springboot扩展点,可以加载缓存,起应用等等:在run方法最后会调用

nacos

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

为什么整合Nacos注册中心后,服务启动就会自动注册,Nacos是如何实现自动服务注册的?

<!--        <dependency>-->
<!--            <groupId>com.alibaba.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>-->
<!--        </dependency>-->
# 对ApplicationListener的扩展
AbstractAutoServiceRegistration#onApplicationEvent
# 服务注册
》NacosServiceRegistry#register

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

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

整合Ribbon、LoadBalancer

SmartInitializingSingleton扩展场景—— 对容器中的Bean对象进行定制处理
为什么@Bean修饰的RestTemplate加上@LoadBalanced就能实现负载均衡功能?
LoadBalancerAutoConfiguration
对SmartInitializingSingleton的扩展,为所有用@LoadBalanced修饰的restTemplate(利用了@Qualifier)绑定实现了负载均衡逻辑的拦截器LoadBalancerInterceptor
image.png


		@Bean
		@ConditionalOnMissingBean
		public RestTemplateCustomizer restTemplateCustomizer(
				final RetryLoadBalancerInterceptor loadBalancerInterceptor) {
			return restTemplate -> {
				List<ClientHttpRequestInterceptor> list = new ArrayList<>(restTemplate.getInterceptors());
				list.add(loadBalancerInterceptor);
				restTemplate.setInterceptors(list);
			};
		}

整合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;
    }
}

和mybatis思路一样Spring整合Mybatis
FeignClientsRegistrar
通过import这个类,从而将feignclient的接口注册为FeignClientFactorybean,通过getobject生成代理对象
image.png
FeignClientFactorybean
image.png
Feign源码分析| ProcessOn免费在线作图,在线流程图,在线思维导图
fiegn.png

  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值