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

com.biz.common.strategy.StrategyInitializer Maven / Gradle / Ivy

Go to download

BizX 是一个灵活而高效的业务开发框架, 其中也有很多为业务开发所需要的工具类的提供。

The newest version!
package com.biz.common.strategy;

import com.biz.common.bean.BizXBeanUtils;
import com.biz.common.reflection.ReflectionUtils;
import com.biz.common.utils.Common;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


/**
 * 策略初始化器类,用于懒加载和缓存策略服务。
 * 

* 该类通过反射机制和泛型类型匹配,将实现了{@link StrategyService}接口的策略服务类缓存起来, * 以便在运行时根据特定参数类型快速选择合适的策略服务。 *

*

* 通过使用ConcurrentMap和ReentrantLock,确保在多线程环境下策略服务的初始化过程是线程安全的。 *

* * @param 策略服务的参数类型 * @author francis * @version 1.0.1 * @since 1.0.1 */ public class StrategyInitializer { /** * 用于存储策略映射的线程安全集合。 * key为参数类型的Class对象,value为对应参数类型的策略服务类列表。 */ private final ConcurrentMap, List>> strategyCacheMap; /** * 初始化策略映射表时使用的锁,确保线程安全。 */ private final Lock initLock = new ReentrantLock(); /** * 构造函数,初始化策略缓存映射表。 */ public StrategyInitializer() { this.strategyCacheMap = new ConcurrentHashMap<>(); } /** * 初始化策略缓存映射表。 *

* 通过反射遍历所有Bean,找出实现了{@link StrategyService}接口且泛型匹配的类,并将其加入到策略缓存映射表中。 * 该方法使用锁来确保多线程环境下的线程安全。 *

* * @param param 泛型参数的Class对象,用于查找匹配的策略服务。 */ public void initStrategyCacheMap(Class param) { if (strategyCacheMap.containsKey(param)) { return; } initLock.lock(); try { List> beanDefinitionClasses = BizXBeanUtils.getBeanDefinitionClasses(); for (Class beanClass : ReflectionUtils.getImplementsClass(StrategyService.class, beanDefinitionClasses)) { for (Class anInterface : ReflectionUtils.getInterfaces(beanClass)) { if (!ReflectionUtils.isImplementsClass(StrategyService.class, anInterface)) { continue; } for (Class interfaceGenericParameterizedType : ReflectionUtils.getInterfaceGenericParameterizedTypes(anInterface)) { if (interfaceGenericParameterizedType.equals(param)) { strategyCacheMap.computeIfAbsent(param, k -> new ArrayList<>()).add(Common.to(beanClass)); } } } } } finally { initLock.unlock(); } } /** * 根据参数类型获取策略服务类列表。 * * @param param 参数类型的Class对象。 * @return 匹配参数类型的策略服务类列表,如果没有匹配的策略则返回null。 */ public List> getStrategies(Class param) { return strategyCacheMap.get(param); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy