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

com.biz.common.serviceloader.BizServiceLoader Maven / Gradle / Ivy

There is a newer version: 1.5.1
Show newest version
package com.biz.common.serviceloader;

import com.biz.common.utils.Common;
import lombok.extern.slf4j.Slf4j;

import java.util.ServiceLoader;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 该类是抽象服务加载器提供者的具体实现,用于加载指定的服务。
 * 它利用Java的ServiceLoader机制来发现并加载服务实现。
 *
 * @author francis
 */
@Slf4j
public class BizServiceLoader extends AbstractServiceLoaderProvider {

    /**
     * 引入缓存机制,存储已加载的服务
     */
    private static final ConcurrentHashMap, Object> serviceCache = new ConcurrentHashMap<>();

    /**
     * 加载指定类的服务。
     * 该方法是抽象方法的实现,具体加载逻辑委托给了loadService方法。
     *
     * @param tClass 服务的类类型
     * @param     服务的泛型类型
     * @return 加载成功返回服务实例,否则返回null
     */
    @Override
    protected  T load(Class tClass) {
        // 检查缓存中是否已加载该服务
        if (serviceCache.containsKey(tClass)) {
            return Common.to(serviceCache.get(tClass));
        }
        T service = loadService(tClass);
        // 将加载的服务缓存起来(如果非null)
        if (service != null) {
            serviceCache.put(tClass, service);
        }
        return service;
    }

    /**
     * 使用ServiceLoader加载指定类的服务。
     * 遍历加载的所有实现类,找到与指定类名匹配的服务并返回。
     * 如果没有找到匹配的服务,则返回null。
     *
     * @param clazz 需要加载的服务的类
     * @param    服务的泛型类型
     * @return 加载成功返回服务实例,否则返回null
     */
    private static  T loadService(Class clazz) {
        try {
            ServiceLoader loadedDrivers = ServiceLoader.load(clazz);
            for (Object next : loadedDrivers) {
                if (clazz.getName().equals(next.getClass().getName())) {
                    // 增加类型安全检查
                    if (clazz.isAssignableFrom(next.getClass())) {
                        return Common.to(next);
                    } else {
                        // 记录日志或处理类型不匹配的问题
                        log.warn("类型不匹配:期望 {},实际 {}", clazz.getName(), next.getClass().getName());
                    }
                }
            }
        } catch (Exception e) {
            log.error("加载服务失败:{},异常:{}", clazz.getName(), e.getMessage());
            throw e;
        }
        return null;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy