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
Bean生命周期主线流程:
https://www.processon.com/view/link/5eafa609f346fb177ba8091f
应用场景
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
@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生成代理对象
FeignClientFactorybean
Feign源码分析| ProcessOn免费在线作图,在线流程图,在线思维导图