From 741c0cfe1a20a8d792496b1d4a2e3b0963f5e1de Mon Sep 17 00:00:00 2001 From: dejavuhuh Date: Sun, 9 Aug 2020 20:47:42 +0800 Subject: [PATCH] =?UTF-8?q?Add:=20SpringUtil.getBean(TypeReference)=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0Spring=E5=B7=A5=E5=85=B7=E7=B1=BB=E9=9D=99?= =?UTF-8?q?=E6=80=81=E6=96=B9=E6=B3=95=EF=BC=8C=E9=80=9A=E8=BF=87=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E5=8F=82=E8=80=83=EF=BC=88TypeReference=EF=BC=89?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=B8=A6=E6=B3=9B=E5=9E=8B=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E7=9A=84Bean=EF=BC=8C=E5=90=8C=E6=97=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E4=B8=80=E4=B8=AA=E5=B0=8F=E7=9A=84=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/extra/spring/SpringUtil.java | 22 ++++++++++++++++++ .../hutool/extra/spring/SpringUtilTest.java | 23 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/hutool-extra/src/main/java/cn/hutool/extra/spring/SpringUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/spring/SpringUtil.java index 5a3b46c13..535b34d74 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/spring/SpringUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/spring/SpringUtil.java @@ -1,10 +1,16 @@ package cn.hutool.extra.spring; +import cn.hutool.core.lang.ParameterizedTypeImpl; +import cn.hutool.core.lang.TypeReference; import cn.hutool.core.util.ArrayUtil; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.springframework.core.ResolvableType; import org.springframework.stereotype.Component; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Arrays; import java.util.Map; /** @@ -73,6 +79,22 @@ public class SpringUtil implements ApplicationContextAware { return applicationContext.getBean(name, clazz); } + /** + * 通过类型参考返回带泛型参数的Bean + * + * @param reference 类型参考,用于持有转换后的泛型类型 + * @param Bean类型 + * @return 带泛型参数的Bean + */ + @SuppressWarnings("unchecked") + public static T getBean(TypeReference reference) { + ParameterizedType parameterizedType = (ParameterizedType) reference.getType(); + Class rawType = (Class) parameterizedType.getRawType(); + Class[] genericTypes = Arrays.stream(parameterizedType.getActualTypeArguments()).map(type -> (Class) type).toArray(Class[]::new); + String[] beanNames = applicationContext.getBeanNamesForType(ResolvableType.forClassWithGenerics(rawType, genericTypes)); + return applicationContext.getBean(beanNames[0], rawType); + } + /** * 获取指定类型对应的所有Bean,包括子类 * diff --git a/hutool-extra/src/test/java/cn/hutool/extra/spring/SpringUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/spring/SpringUtilTest.java index 0bff7ee5a..ed1074771 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/spring/SpringUtilTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/spring/SpringUtilTest.java @@ -1,5 +1,7 @@ package cn.hutool.extra.spring; +import cn.hutool.core.lang.TypeReference; +import cn.hutool.core.map.MapUtil; import lombok.Data; import org.junit.Assert; import org.junit.Test; @@ -8,6 +10,11 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = {SpringUtil.class, SpringUtilTest.Demo2.class}) //@Import(cn.hutool.extra.spring.SpringUtil.class) @@ -20,6 +27,14 @@ public class SpringUtilTest { Assert.assertEquals("test", testDemo.getName()); } + @Test + public void getBeanWithTypeReferenceTest() { + Map mapBean = SpringUtil.getBean(new TypeReference>() {}); + Assert.assertNotNull(mapBean); + Assert.assertEquals("value1", mapBean.get("key1")); + Assert.assertEquals("value2", mapBean.get("key2")); + } + @Data public static class Demo2{ private long id; @@ -32,5 +47,13 @@ public class SpringUtilTest { demo.setName("test"); return demo; } + + @Bean(name="mapDemo") + public Map generateMap() { + HashMap map = MapUtil.newHashMap(); + map.put("key1", "value1"); + map.put("key2", "value2"); + return map; + } } }