半日闲

因过竹院逢僧话,又得浮生半日闲

0%

Dubbo源码解读6-扩展点类ExtensionLoader getDefaultExtension()和getExtension(String name)方法

逻辑解析

  1. 根据名称来获取扩展名, 先从缓存实例中去查找,如果查找,则进行下一步,否则,在从缓存类中去查找并实例化,如果缓存中不存在,则抛出异常。
  2. 如果wrap为true,则查找包装类,从cachedWrapperClasses中加载,并进行排序,然后判定类是否被@Wrapper注解修饰(貌似没用), 然后通过顺序将实例注入到包装类中,并返回。

    相关代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    public T getDefaultExtension() {
    getExtensionClasses();
    if (StringUtils.isBlank(cachedDefaultName) || "true".equals(cachedDefaultName)) {
    return null;
    }
    return getExtension(cachedDefaultName);
    }
    public T getExtension(String name) {
    return getExtension(name, true);
    }
    public T getExtension(String name, boolean wrap) {
    if (StringUtils.isEmpty(name)) {
    throw new IllegalArgumentException("Extension name == null");
    }
    if ("true".equals(name)) {
    return getDefaultExtension();
    }
    final Holder<Object> holder = getOrCreateHolder(name);
    Object instance = holder.get();
    if (instance == null) {
    synchronized (holder) {
    instance = holder.get();
    if (instance == null) {
    instance = createExtension(name, wrap);
    holder.set(instance);
    }
    }
    }
    return (T) instance;
    }
    private T createExtension(String name, boolean wrap) {
    Class<?> clazz = getExtensionClasses().get(name);
    if (clazz == null || unacceptableExceptions.contains(name)) {
    throw findException(name);
    }
    try {
    T instance = (T) EXTENSION_INSTANCES.get(clazz);
    if (instance == null) {
    EXTENSION_INSTANCES.putIfAbsent(clazz, clazz.getDeclaredConstructor().newInstance());
    instance = (T) EXTENSION_INSTANCES.get(clazz);
    }
    injectExtension(instance);
    if (wrap) {
    List<Class<?>> wrapperClassesList = new ArrayList<>();
    if (cachedWrapperClasses != null) {
    wrapperClassesList.addAll(cachedWrapperClasses);
    wrapperClassesList.sort(WrapperComparator.COMPARATOR);
    Collections.reverse(wrapperClassesList);
    }
    if (CollectionUtils.isNotEmpty(wrapperClassesList)) {
    for (Class<?> wrapperClass : wrapperClassesList) {
    Wrapper wrapper = wrapperClass.getAnnotation(Wrapper.class);
    if (wrapper == null
    || (ArrayUtils.contains(wrapper.matches(), name) && !ArrayUtils.contains(wrapper.mismatches(), name))) {
    instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance));
    }
    }
    }
    }
    initExtension(instance);
    return instance;
    } catch (Throwable t) {
    throw new IllegalStateException("Extension instance (name: " + name + ", class: " +
    type + ") couldn't be instantiated: " + t.getMessage(), t);
    }
    }