xiejun
2024-11-01 80b6cbfc9c861469146318d0b3dd5f8b8b525b8a
Source/BladeX-Tool/blade-core-tool/src/main/java/org/springblade/core/tool/utils/ThreadLocalUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,136 @@
/*
 *
 * Copyright 2019 http://www.hswebframework.org
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
package org.springblade.core.tool.utils;
import org.springframework.lang.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Supplier;
/**
 * ThreadLocal å·¥å…·ç±»,通过在ThreadLocal存储map信息,来实现在ThreadLocal中维护多个信息
 * <br>e.g.<code>
 * ThreadLocalUtils.put("key",value);<br>
 * ThreadLocalUtils.get("key");<br>
 * ThreadLocalUtils.remove("key");<br>
 * ThreadLocalUtils.getAndRemove("key");<br>
 * ThreadLocalUtils.get("key",()-&gt;defaultValue);<br>
 * ThreadLocalUtils.clear();<br>
 * </code>
 *
 * @author zhouhao
 * @since 2.0
 */
@SuppressWarnings("unchecked")
public class ThreadLocalUtil {
   private static final ThreadLocal<Map<String, Object>> LOCAL = ThreadLocal.withInitial(HashMap::new);
   /**
    * @return threadLocal中的全部值
    */
   public static Map<String, Object> getAll() {
      return new HashMap<>(LOCAL.get());
   }
   /**
    * è®¾ç½®ä¸€ä¸ªå€¼åˆ°ThreadLocal
    *
    * @param key   é”®
    * @param value å€¼
    * @param <T>   å€¼çš„类型
    * @return è¢«æ”¾å…¥çš„值
    * @see Map#put(Object, Object)
    */
   public static <T> T put(String key, T value) {
      LOCAL.get().put(key, value);
      return value;
   }
   /**
    * è®¾ç½®ä¸€ä¸ªå€¼åˆ°ThreadLocal
    *
    * @param map map
    * @return è¢«æ”¾å…¥çš„值
    * @see Map#putAll(Map)
    */
   public static void put(Map<String, Object> map) {
      LOCAL.get().putAll(map);
   }
   /**
    * åˆ é™¤å‚数对应的值
    *
    * @param key
    * @see Map#remove(Object)
    */
   public static void remove(String key) {
      LOCAL.get().remove(key);
   }
   /**
    * æ¸…空ThreadLocal
    *
    * @see Map#clear()
    */
   public static void clear() {
      LOCAL.remove();
   }
   /**
    * ä»ŽThreadLocal中获取值
    *
    * @param key é”®
    * @param <T> å€¼æ³›åž‹
    * @return å€¼, ä¸å­˜åœ¨åˆ™è¿”回null, å¦‚果类型与泛型不一致, å¯èƒ½æŠ›å‡º{@link ClassCastException}
    * @see Map#get(Object)
    * @see ClassCastException
    */
   @Nullable
   public static <T> T get(String key) {
      return ((T) LOCAL.get().get(key));
   }
   /**
    * ä»ŽThreadLocal中获取值,并指定一个当值不存在的提供者
    *
    * @see Supplier
    */
   @Nullable
   public static <T> T getIfAbsent(String key, Supplier<T> supplierOnNull) {
      return ((T) LOCAL.get().computeIfAbsent(key, k -> supplierOnNull.get()));
   }
   /**
    * èŽ·å–ä¸€ä¸ªå€¼åŽç„¶åŽåˆ é™¤æŽ‰
    *
    * @param key é”®
    * @param <T> å€¼ç±»åž‹
    * @return å€¼, ä¸å­˜åœ¨åˆ™è¿”回null
    * @see this#get(String)
    * @see this#remove(String)
    */
   public static <T> T getAndRemove(String key) {
      try {
         return get(key);
      } finally {
         remove(key);
      }
   }
}