download: SpringBoot 2.x 实战仿B站高性能后端项目
Dubbo源码篇---Wrapper详解
Wrapper
wrapper为Dubbo SPI扩展类的包装对象,其实际作用起到了代理的作用。当Dubbo在解析SPI配置时,如果有相关的包装类,将被缓存在cachedWrapperClasses中,在执行getExtension时,如果需要包装类,将返回该扩展类的包装类。
Wrapper注解
Dubbo提供了Wrapper注解,当包装类上无此注解作用时,表示该扩展的所有扩展类都将会被该Wrapper类代理;否则需要在该注解上根据该扩展的扩展类名称,通过matches指定需要代理的扩展类,或通过mismatches指定不需要代理的扩展类。
源码分析
Wrapper包装类解析
private void loadClass(Map<String, Class<?>> extensionClasses, java.net.URL resourceURL, Class<?> clazz, String name,
boolean overridden) throws NoSuchMethodException {
// 忽略这里的无关代码
// 检测目标类上是否有@Adaptive注解
if (clazz.isAnnotationPresent(Adaptive.class)) {
// 忽略这里的无关代码
// 检测类是否是wrapper类型
} else if (isWrapperClass(clazz)) {
// 设置缓存
cacheWrapperClass(clazz);
// 到了这里表示这是一个普通的扩展类
} else {
//忽略这里的无关代码
}
}