Spring学习--SpringCore包的主要功能介绍.1

作者: followtry | 2021-05-08 | 阅读
「编辑」 「本文源码」

CollectionFactory

CollectionFactory是用来生成相近的或者判断是否是相近集合的工厂类。

主要判断

  1. 集合:

    • 是否是相近的集合类;创建相近的空集合对象
  2. Map:

    • 是否是相近的Map类;创建相近的空的Map对象。

主要的指定的类如下

// Standard collection interfaces
approximableCollectionTypes.add(Collection.class);
approximableCollectionTypes.add(List.class);
approximableCollectionTypes.add(Set.class);
approximableCollectionTypes.add(SortedSet.class);
approximableCollectionTypes.add(NavigableSet.class);
approximableMapTypes.add(Map.class);
approximableMapTypes.add(SortedMap.class);
approximableMapTypes.add(NavigableMap.class);

// Common concrete collection classes
approximableCollectionTypes.add(ArrayList.class);
approximableCollectionTypes.add(LinkedList.class);
approximableCollectionTypes.add(HashSet.class);
approximableCollectionTypes.add(LinkedHashSet.class);
approximableCollectionTypes.add(TreeSet.class);
approximableCollectionTypes.add(EnumSet.class);
approximableMapTypes.add(HashMap.class);
approximableMapTypes.add(LinkedHashMap.class);
approximableMapTypes.add(TreeMap.class);
approximableMapTypes.add(EnumMap.class);

通过对象实例创建相近的集合

主要逻辑判断依次如下

  1. 给定的对象是否是LinkedList类型,是的话新建LinkedList的对象
  2. 给定对象是否是List,是的话新建ArrayList的对象
  3. 给定对象是否是EnumSet,是的话克隆一份并清空数据
  4. 给定对象是否是SortedSet,是的话将对象排序并生成新的TreeSet对象
  5. 如果以上条件都不符合清空下,生成空的LinkedHashSet对象。
public static <E> Collection<E> createApproximateCollection(@Nullable Object collection, int capacity) {
		if (collection instanceof LinkedList) {
			return new LinkedList<>();
		}
		else if (collection instanceof List) {
			return new ArrayList<>(capacity);
		}
		else if (collection instanceof EnumSet) {
			// Cast is necessary for compilation in Eclipse 4.4.1.
			Collection<E> enumSet = (Collection<E>) EnumSet.copyOf((EnumSet) collection);
			enumSet.clear();
			return enumSet;
		}
		else if (collection instanceof SortedSet) {
			return new TreeSet<>(((SortedSet<E>) collection).comparator());
		}
		else {
			return new LinkedHashSet<>(capacity);
		}
	}

通过对象Class类型创建集合

主要逻辑判断依次如下

  1. 给定类型是接口并且是Set或者Collection类型,则生成新的LinkedHashSet对象
  2. 给定类型是List,则生成ArrayList对象
  3. 给定类型如果是SortedSet或者NavigableSet,则生成新的TreeSet对象
  4. 如果给定类型来自于EnumSet,则创建空的EnumSet对象
  5. 否则通过反射方式获取给定类型的构造方法,生成新的实例
public static <E> Collection<E> createCollection(Class<?> collectionType, @Nullable Class<?> elementType, int capacity) {
	Assert.notNull(collectionType, "Collection type must not be null");
	if (collectionType.isInterface()) {
		if (Set.class == collectionType || Collection.class == collectionType) {
			return new LinkedHashSet<>(capacity);
		}
		else if (List.class == collectionType) {
			return new ArrayList<>(capacity);
		}
		else if (SortedSet.class == collectionType || NavigableSet.class == collectionType) {
			return new TreeSet<>();
		}
	}
	else if (EnumSet.class.isAssignableFrom(collectionType)) {
		// Cast is necessary for compilation in Eclipse 4.4.1.
		return (Collection<E>) EnumSet.noneOf(asEnumType(elementType));
	}
	else {
		return (Collection<E>) ReflectionUtils.accessibleConstructor(collectionType).newInstance();
	}
}

通过对象实例创建相近的Map

该方法还是比较简单的,通过给定的Map实例来判断具体类型,如果是EnumMap则生成空的EnumMap类型。如果是SortedMap则创建TreeMap对象,否则创建LinkedHashMap对象

public static <K, V> Map<K, V> createApproximateMap(@Nullable Object map, int capacity) {
		if (map instanceof EnumMap) {
			EnumMap enumMap = new EnumMap((EnumMap) map);
			enumMap.clear();
			return enumMap;
		}
		else if (map instanceof SortedMap) {
			return new TreeMap<>(((SortedMap<K, V>) map).comparator());
		}
		else {
			return new LinkedHashMap<>(capacity);
		}
	}

通过Map类型创建对应的Map实例

  1. 先判断给定类型是否是接口,然后判断如果是Map类型,生成LinkedHashMap的空对象。
  2. 如果是SortedMapNavigableMap类型,生成TreeMap空对象
  3. 如果是MultiValueMap类型,生成LinkedMultiValueMap对象
  4. 如果是EnumMap类型,生成EnumMap的空对象
  5. 否则反射通过Map的构造方法生成新的空对象。
public static <K, V> Map<K, V> createMap(Class<?> mapType, @Nullable Class<?> keyType, int capacity) {
		Assert.notNull(mapType, "Map type must not be null");
		if (mapType.isInterface()) {
			if (Map.class == mapType) {
				return new LinkedHashMap<>(capacity);
			}
			else if (SortedMap.class == mapType || NavigableMap.class == mapType) {
				return new TreeMap<>();
			}
			else if (MultiValueMap.class == mapType) {
				return new LinkedMultiValueMap();
			}
		}
		else if (EnumMap.class == mapType) {
			return new EnumMap(asEnumType(keyType));
		}
		else {
			
			return (Map<K, V>) ReflectionUtils.accessibleConstructor(mapType).newInstance();
			
		}
	}

创建可适配为String的Properties。

内部使用SortedProperties来存储,当获取值时,如果值为空则返回null,否则返回value.toString()格式

public static Properties createStringAdaptingProperties() {
	return new SortedProperties(false) {
		@Override
		@Nullable
		public String getProperty(String key) {
			Object value = get(key);
			return (value != null ? value.toString() : null);
		}
	};
}

Constants

常量类,该类是将指定的class的标记为public static final类型的变量缓存在Map结构中。

可以通过前缀或后缀找到指定的key集合,或者将获取的常量值转化为Object,String和Number。主要是给PropertyEditors用的。

Conventions

主要用来将类名转换为变量名

com.myapp.Product 转为 product
com.myapp.MyProduct 转为 myProduct
m.myapp.UKProduct 转为 UKProduct
Mono<com.myapp.Product> 转为  productMono
Flux<com.myapp.MyProduct> 转为 myProductFlux
Observable<com.myapp.MyProduct> 转为 myProductObservable

如果对于复数的情况,会在以上的参数名后再加上List字符串作为后缀。代码里用的不多,就不过多分析了。感兴趣的可以自行研究下。

DecoratingProxy

是代理类的包装接口,SpringAOP的代理或者自定义的代理。接口方法getDecoratedClass是要获取最终的目标里,而不是最近一层目标类。对于多层代理是比较有用的。

ParameterNameDiscoverer

参数名称发现的接口,该接口可以获得参数的实际名称,如果是真实名称的话会获得真实名称。该接口有三种策略实现KotlinReflectionParameterNameDiscoverer,StandardReflectionParameterNameDiscoverer,LocalVariableTableParameterNameDiscoverer

  1. KotlinReflectionParameterNameDiscoverer是给kotlin的类和接口使用的。
  2. StandardReflectionParameterNameDiscoverer如果需要获取真实名称,需要在编译时使用-parameters参数
  3. LocalVariableTableParameterNameDiscoverer使用ASM库来分析类文件

ExceptionDepthComparator

可以根据异常抛出的深度对异常进行排序,也可以获取到异常的深度。

ReactiveAdapter

反应式适配器,用来将反应式流适配到一个异步或者反映式类型或者反向。还有个名为ReactiveAdapterRegistry的注册器,用来判断注册ReactorRxJava1,RxJava2,Java 9+ Flow.Publisherkotlin Coroutines等不同类型的流适配器


版权声明:本文由 followtry 在 2021年05月08日发表。本文采用CC BY-NC-SA 4.0许可协议,非商业转载请注明出处,不得用于商业目的。
文章题目及链接:《Spring学习--SpringCore包的主要功能介绍.1》




  相关文章:

「游客及非Github用户留言」:

「Github登录用户留言」:

TOP