All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.featherfly.common.lang.ServiceLoaderUtils Maven / Gradle / Ivy

There is a newer version: 1.7.12
Show newest version

package cn.featherfly.common.lang;

import java.util.ArrayList;
import java.util.List;
import java.util.ServiceLoader;

/**
 * 

* ServiceLoaderUtils *

* * @author zhongj */ public final class ServiceLoaderUtils { /** */ private ServiceLoaderUtils() { } /** *

* 找到多个服务时的策略 *

* @author zhongj */ public enum MultiPolicy { /** * 出现加载多个时抛出异常 */ EXCEPTION /** * 出现加载多个时使用第一个 */ , FIRST /** * 出现加载多个时使用最后一个 */ , LAST; } /** *

* 没有找到服务时的策略 *

* @author zhongj */ public enum NotFoundPolicy { /** * 没有可加载时抛出异常 */ exception /** * 忽略,返回null */ , ignore } /** *

* 使用Java SPI加载指定服务. *

* @param serviceType 服务类型 * @param 泛型 * @return 服务实现 */ public static T load(Class serviceType) { return load(serviceType, null); } /** *

* 使用Java SPI加载指定服务,如果没有找到则使用传入的默认实现. *

* @param serviceType 服务类型 * @param defaultService 默认服务实现 * @param 泛型 * @return 服务实现 */ public static T load(Class serviceType, T defaultService) { return load(serviceType, defaultService, MultiPolicy.EXCEPTION, NotFoundPolicy.exception); } /** *

* 使用Java SPI加载指定服务,如果没有找到则使用传入的默认实现. *

* @param serviceType 服务类型 * @param defaultService 默认服务实现 * @param multyPolicy 加载出多个实现时的策略{@link MultiPolicy} * @param notFoundPolicy 没有加载到实现并且传入的默认实现为空时的策略{@link NotFoundPolicy} * @param 泛型 * @return 服务实现 */ public static T load(Class serviceType, T defaultService, MultiPolicy multyPolicy , NotFoundPolicy notFoundPolicy) { List factorys = loadAll(serviceType); if (factorys.size() > 1) { if (multyPolicy == null) { multyPolicy = MultiPolicy.EXCEPTION; } switch (multyPolicy) { case FIRST: return factorys.get(0); case LAST: return factorys.get(factorys.size() - 1); default: throw new IllegalArgumentException("找到多个" + serviceType.getName() + "实现 -> " + factorys); } } if (factorys.isEmpty()) { return loadOnNotFound(serviceType, defaultService, notFoundPolicy); } else { return factorys.get(0); } } private static T loadOnNotFound(Class serviceType, T defaultService, NotFoundPolicy notFoundPolicy) { if (defaultService == null) { switch (notFoundPolicy) { case ignore: return null; default: throw new IllegalArgumentException("没有找到" + serviceType.getName() + "实现"); } } else { return defaultService; } } /** *

* 使用Java SPI加载全部服务 *

* @param serviceType 服务类型 * @param 泛型 * @return 服务实现集合 */ public static List loadAll(Class serviceType) { ServiceLoader serviceLoader = ServiceLoader.load(serviceType); List services = new ArrayList(); for (T service : serviceLoader) { services.add(service); } return services; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy