@SPI
标注一个接口是一个扩展点,可以被Dubbo的ExtensionLoader加载
@Adaptive
作用在类上,Dubbo源码中实现好的自适应扩展实现类,<br>AdaptiveExtensionFactory和AdaptiveCompiler使用该注解
作用在方法上,表示是一个自适应方法,Dubbo在扩展点生成自适应实例时,<br>会为该方法生成对应的代码,方法内部根据方法的参数,来决定使用哪个扩展
@Active
扩展点自动激活,应用于集合类扩展点如Filter<br>@Activate("xxx"),当配置了xxx参数,并且参数值为有效值时激活<br>@Activate(group="provider",value="xxx"),只对提供方激活<br>
ExtensionLoader
核心属性
缓存扩展类型的加载类(ExtensionLoader)实例<br>private static final ConcurrentMap<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS = new ConcurrentHashMap<>(64);
缓存加载过的扩展实现类实例<br>private static final ConcurrentMap<Class<?>, Object> EXTENSION_INSTANCES = new ConcurrentHashMap<>(64);
定义ExtensionLoader实例加载的扩展点(接口)类型<br>private final Class<?> type;
缓存扩展实例配置名和扩展实现类类名<br>private final Holder<Map<String, Class<?>>> cachedClasses = new Holder<>();
private final ConcurrentMap<String, Holder<Object>> cachedInstances = new ConcurrentHashMap<>();
定义扩展点实现IOC功能的工厂,Dubbo实现有的SpiExtensionFactory和SpringExtensionFactory,并且支持自适应适配<br>private final ExtensionFactory objectFactory;<br>
构造器
私有化构造器,初始化时指定加载扩展的类型<br>private ExtensionLoader(Class<?> type) {<br> this.type = type;<br> objectFactory =(type == ExtensionFactory.class ? null : <br>ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());<br> }
加载指定name的扩展点实例
//获取扩展点的ExtensionLoader实例<br>public static <T> ExtensionLoader<T> getExtensionLoader(Class<T> type)
//获取指定配置名称的扩展实现类<br>public T getExtension(String name)
//没有从缓存中获取到,则创建一个实例<br>private T createExtension(String name)<br>
//查询扩展点实现类的类型<br>private Map<Strring,Class<?> getExtensionClasses()
//如果没有从缓存中查询到对象的扩展点类型对象,则开始从配置目录加载<br>private Map<String, Class<?>> loadExtensionClasses()<br>
//扫描文件路径下的SPI扩展配置文件<br>private void loadDirectory()<br>
//读取配置文件实例化扩展点配置的CLass实例<br>private void loadResource()
IOC自动装配功能实现
//createExtension方法中初始化实例后调用InjectExtension方法通过setter方式注入依赖的属性<br>private T injectExtension(T instance)
//通过objectFactory进行依赖查找,进行反射调用注入<br>Object object = objectFactory.getExtension(pt, property);<br>
AOP功能warpper实现
private Set<Class<?>> cachedWrapperClasses;//缓存wrapper Class<br><br>try { <br> clazz.getConstructor(type); <br> Set<Class<?>> wrappers = cachedWrapperClasses;<br> if (wrappers == null) {<br> cachedWrapperClasses = new ConcurrentHashSet<Class<?>>();<br> wrappers = cachedWrapperClasses;<br> }<br> wrappers.add(clazz);<br>} catch (NoSuchMethodException e) {}
自适应扩展实例
//获取扩展点的自适应实例<br>public T getAdaptiveExtension()
Dubbo实现的Adaptive扩展点有ExtensionFactory 和AdaptiveCompiler,<br>其他的自适应实例都是通过拼接动态代码编译后生成的
//调用这个方法表明Dubbo的源码中没有实现当前扩展点的自适应实例,需要动态创建<br>private T createAdaptiveExtension()<br>
//根据当前扩展点接口动态生成需要自适应的方法实现,包含拼接代码和编译过程<br>private Class<?> createAdaptiveExtensionClass()
ExtensionFactory
AdaptiveExtensionFactory
//初始化时在构造器中加载Dubbo配置所支持的ExtensionFactory扩展实例<br>private final List<ExtensionFactory> factories;
//构造器中,初始化Dubbo支持的extensionFactory实例<br>public AdaptiveExtensionFactory(){<br> ExtensionLoader<ExtensionFactory> loader = ExtensionLoader.getExtensionLoader(ExtensionFactory.class);<br> List<ExtensionFactory> list = new ArrayList<>();<br> //加载项目配置支持的ExtensionFactory类<br> for (String extension : loader.getSupportedExtensions()) {<br> ExtensionFactory factory = loader.getExtension(extension);<br> list.add(factory);<br> }<br> factories = Collections.unmodifiableList(list);<br> }<br>
//实现ExtensionFactory接口的获取指定名称的实例,循环factories从具体的ObjectFactory实现中查找<br>public <T> T getExtension(Class<T> clazz, String name)<br>
SPIExtensionFactory
实现ExtensionLoader接口,使用Dubbo自定的ExtensionLoader加载指定name的扩展实现实例,<br>这里返回的实例是一个Adaptive的实例,为了实现扩展点的自适应功能
SpringExtensionFactory
从Spring容器中加载指定name和Class对象的实例
Holder<T>
把一个对象包装一下,使用volatile修饰 当前对象,保证关键对象的可见性