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; + } + } }