如果有很多的包装类,那么就会形成一个责任链条,一个套一个 。
所以dubbo的aop跟spring的aop实现是不一样的,spring的aop底层是基于动态代理来的,而dubbo的aop其实算是静态代理,dubbo会帮你自动组装这个代理,形成一条责任链 。
到这其实我们已经知道,dubbo的spi接口的实现类已经有两种类型了:
- 自适应类
- Wrapper类
@SPI("random")public interface LoadBalance {}
此时random这个key对应的实现类就是默认实现,通过getDefaultExtension这个方法就可以获取到默认实现对象 。
3、自动激活所谓的自动激活,就是根据你的入参,动态地选择一批实现类返回给你 。
自动激活的实现类上需要加上Activate注解,这里就又学习了一种实现类的分类 。
@Activatepublic interface RandomLoadBalance {}
此时RandomLoadBalance就属于可以被自动激活的类 。
获取自动激活类的方法是getActivateExtension,所以根据这个方法的入参,可以动态选择一批实现类 。
自动激活这个机制在Dubbo一个核心的使用场景就是Filter过滤器链中 。
Filter是dubbo中的一个扩展点,可以在请求发起前或者是响应获取之后就行拦截,作用有点像Spring MVC中的HandlerInterceptor 。
文章插图
Filter的一些实现类
如上Filter有很多实现,所以为了能够区分Filter的实现是作用于provider的还是consumer端,所以就可以用自动激活的机制来根据入参来动态选择一批Filter实现 。
比如说ConsumerContextFilter这个Filter就作用于Consumer端 。
文章插图
ConsumerContextFilter
最后,这里并没有对dubbo的SPI机制进行源码分析,感兴趣的同学可以看一下面试常问的dubbo的spi机制到底是什么?(上)和 面试常问的dubbo的spi机制到底是什么?(下)两篇文章 。
总结通过以上分析可以看出,实现SPI机制的核心原理就是通过IO流读取指定文件的内容,然后解析,最后加入一些自己的特性 。
最后总的来说,Java的SPI实现的比较简单,并没有什么其它功能;Spring得益于自身的ioc和aop的功能,所以也没有实现太复杂的SPI机制,仅仅是对Java做了一点简化和优化;但是dubbo的SPI机制为了满足自身框架的使用要求,实现的功能就比较多,不仅将ioc和aop的功能集成到SPI机制中,还提供注入自适应和自动激活等功能 。
【阿里一面:说一说Java、Spring、Dubbo三者SPI机制的原理和区别】
推荐阅读
- 静态路由or动态路由,一个例子说明白!
- 贾玲|真被热巴说中了!曝贾玲秘密生子,范丞丞冲上热搜榜一
- 阿里p6是什么级别(p6级别工资标准)
- 闭口是什么意思(如何去闭口)
- 厂长为什么叫7酱(lpl解说鼓鼓多人运动)
- 裁剪视频用什么软件(电商视频剪辑用什么软件)
- 拜灶神要说什么 拜灶神要怎样说话
- 西装裤配什么鞋子(西装裤怎么搭配上衣)
- 谛听为什么不说出真相(谛听为啥听出来真假不说)
- 每个手指戴戒指的含义怎么说 每个手指戴戒指的含义