From 33c57727385368fb303a9cdc140af531d391f1e0 Mon Sep 17 00:00:00 2001
From: wangyu <727842003@qq.com>
Date: Wed, 9 Aug 2023 14:35:28 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC?=
=?UTF-8?q?=EF=BC=8C=E5=88=A0=E9=99=A4=E8=BF=87=E6=97=B6=E7=9A=84reflectio?=
=?UTF-8?q?ns=E4=BE=9D=E8=B5=96=EF=BC=8C=E4=BD=BF=E7=94=A8spring=E5=86=85?=
=?UTF-8?q?=E7=BD=AE=E6=89=AB=E6=8F=8F=E6=96=B9=E6=B3=95=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 4 +-
pom.xml | 9 +--
rest-proxy-api/pom.xml | 2 +-
rest-proxy-core/pom.xml | 2 +-
.../rest/registry/RestApiRegistry.java | 68 ++++++++++++++++---
5 files changed, 66 insertions(+), 19 deletions(-)
diff --git a/README.md b/README.md
index 15fceab..625cdf9 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@ Rest Proxy组件是本人在长期的系统对接工作中提炼出的一个可
具体是这样的:**写一个interface,定义几个method,然后加上注解,完成!**,在业务里直接调用method即可,不需要写任何实现类!
## REST请求代理(基于Http Interface)
-本组件基于SpringBoot2.7.7构建,支持完整的AutoConfiguraiton。仅需要极少量配置就可以完成配置。当前最新版本为`1.1.3`,新增了标准REST注解。
+本组件基于SpringBoot2.7.7构建,支持完整的AutoConfiguraiton。仅需要极少量配置就可以完成配置。当前最新版本为`1.1.4`,新增了标准REST注解。
### 特性列表
- 无感知自动注入,只需interface + 注解即可轻松完成对接
@@ -29,7 +29,7 @@ Rest Proxy组件是本人在长期的系统对接工作中提炼出的一个可
group.flyfish
rest-proxy-core
- 1.1.3
+ 1.1.4
```
diff --git a/pom.xml b/pom.xml
index 5da72ba..9e7ad11 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
group.flyfish
rest-proxy
- 1.1.3
+ 1.1.4
8
@@ -22,7 +22,7 @@
1.8
4.4
2.6
- 1.1.3
+ 1.1.4
pom
@@ -45,11 +45,6 @@
commons-collections4
${commons-collection.version}
-
- org.reflections
- reflections
- 0.10.2
-
group.flyfish
rest-proxy-api
diff --git a/rest-proxy-api/pom.xml b/rest-proxy-api/pom.xml
index 0fa40d2..a819562 100644
--- a/rest-proxy-api/pom.xml
+++ b/rest-proxy-api/pom.xml
@@ -5,7 +5,7 @@
group.flyfish
rest-proxy
- 1.1.3
+ 1.1.4
4.0.0
diff --git a/rest-proxy-core/pom.xml b/rest-proxy-core/pom.xml
index 0b900d0..704179e 100644
--- a/rest-proxy-core/pom.xml
+++ b/rest-proxy-core/pom.xml
@@ -5,7 +5,7 @@
group.flyfish
rest-proxy
- 1.1.3
+ 1.1.4
4.0.0
diff --git a/rest-proxy-core/src/main/java/group/flyfish/rest/registry/RestApiRegistry.java b/rest-proxy-core/src/main/java/group/flyfish/rest/registry/RestApiRegistry.java
index 2aa6ef9..e081520 100644
--- a/rest-proxy-core/src/main/java/group/flyfish/rest/registry/RestApiRegistry.java
+++ b/rest-proxy-core/src/main/java/group/flyfish/rest/registry/RestApiRegistry.java
@@ -10,18 +10,25 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
-import org.reflections.Reflections;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
+import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.*;
+import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
+import org.springframework.core.type.classreading.MetadataReader;
+import org.springframework.core.type.filter.AnnotationTypeFilter;
+import org.springframework.lang.NonNull;
import org.springframework.util.Assert;
+import org.springframework.util.ClassUtils;
import org.springframework.util.CollectionUtils;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
/**
@@ -66,13 +73,21 @@ public class RestApiRegistry implements BeanDefinitionRegistryPostProcessor, Bea
if (DataUtils.isNotEmpty(packageNames)) {
// 初始化反射
try {
- Reflections reflections = new Reflections(packageNames.toArray());
- // 得到Resource注解的类
- Set> classSet = reflections.getTypesAnnotatedWith(RestService.class);
- // 不存在,不要浪费性能
- if (CollectionUtils.isEmpty(classSet)) return;
- // 代理并生成子类,并注册到ioc容器
- classSet.forEach(clazz -> registry.registerBeanDefinition(clazz.getName(), generate(clazz)));
+ RestServiceComponentProvider scanner = new RestServiceComponentProvider();
+ scanner.resetFilters(false);
+ scanner.addIncludeFilter(new AnnotationTypeFilter(RestService.class));
+ // 获取扫描器的ClassLoader,保证同源
+ ClassLoader cl = scanner.getClass().getClassLoader();
+ for (String packageName : packageNames) {
+ Set bfs = scanner.findCandidateComponents(packageName);
+ // 不存在,不要浪费性能
+ if (CollectionUtils.isEmpty(bfs)) return;
+ // 代理并生成子类,并注册到ioc容器
+ bfs.stream()
+ .map(bf -> resolveType(bf, cl))
+ .filter(Objects::nonNull)
+ .forEach(clazz -> registry.registerBeanDefinition(clazz.getName(), generate(clazz)));
+ }
} catch (IllegalStateException e) {
log.error("初始化Rest映射时出错", e);
}
@@ -103,4 +118,41 @@ public class RestApiRegistry implements BeanDefinitionRegistryPostProcessor, Bea
Assert.isTrue(beanFactory instanceof ConfigurableListableBeanFactory, "当前bean factory不被支持!");
this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
}
+
+ private Class> resolveType(BeanDefinition bf, ClassLoader cl) {
+ if (null != bf.getBeanClassName()) {
+ try {
+ return ClassUtils.forName(bf.getBeanClassName(), cl);
+ } catch (ClassNotFoundException e) {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 内部的包扫描器,提供特定注解扫描
+ *
+ * @author wangyu
+ */
+ private static class RestServiceComponentProvider extends ClassPathScanningCandidateComponentProvider {
+
+ private final AnnotationTypeFilter filter = new AnnotationTypeFilter(RestService.class);
+
+ private RestServiceComponentProvider() {
+ super(false);
+ resetFilters(false);
+ addIncludeFilter(filter);
+ }
+
+ @Override
+ protected boolean isCandidateComponent(@NonNull MetadataReader metadataReader) throws IOException {
+ return filter.match(metadataReader, getMetadataReaderFactory());
+ }
+
+ @Override
+ protected boolean isCandidateComponent(@NonNull AnnotatedBeanDefinition beanDefinition) {
+ return true;
+ }
+ }
}