Ver Fonte

!4 add src/main/java/io/renren/common/utils/BeanFindUtils.java.
Merge pull request !4 from relyone/N/A

独孤求胜 há 1 ano atrás
pai
commit
b327b836c6
1 ficheiros alterados com 65 adições e 0 exclusões
  1. 65 0
      src/main/java/io/renren/common/utils/BeanFindUtils.java

+ 65 - 0
src/main/java/io/renren/common/utils/BeanFindUtils.java

@@ -0,0 +1,65 @@
+package io.renren.common.utils;
+
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
+import org.springframework.core.type.filter.AnnotationTypeFilter;
+import org.springframework.core.type.filter.AssignableTypeFilter;
+
+import java.lang.annotation.Annotation;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 查询特定的类,该工具下的方法应该在程序启动完成之后才可以使用
+ */
+public class BeanFindUtils {
+
+    private static ClassPathScanningCandidateComponentProvider scanner;
+
+    /**
+     * 查询指定了特定注解的类
+     * @param basePackage 类所存放的包名
+     * @param annotation 特定的注解
+     * @return 目标类
+     */
+    public static Set<Class<?>> findAnnotation(String basePackage, Class<? extends Annotation> annotation) {
+        ClassPathScanningCandidateComponentProvider scanner = getInstance();
+        scanner.addIncludeFilter(new AnnotationTypeFilter(annotation));
+        return getClasses(basePackage, scanner);
+    }
+
+    /**
+     * 查询实现了特定接口的类
+     * @param basePackage 类所存放的包名
+     * @param interfaceClass 特定的接口
+     * @return 目标类
+     */
+    public static Set<Class<?>> findInterface(String basePackage, Class<?> interfaceClass) {
+        ClassPathScanningCandidateComponentProvider scanner = getInstance();
+        scanner.addIncludeFilter(new AssignableTypeFilter(interfaceClass));
+        return getClasses(basePackage, scanner);
+    }
+
+
+    private static Set<Class<?>> getClasses(String basePackage, ClassPathScanningCandidateComponentProvider scanner) {
+        Set<BeanDefinition> beanDefinitions = scanner.findCandidateComponents(basePackage);
+        return beanDefinitions.stream()
+                .map(BeanDefinition::getBeanClassName)
+                .map(className -> {
+                    try {
+                        return Class.forName(className);
+                    } catch (ClassNotFoundException e) {
+                        throw new RuntimeException(e);
+                    }
+                })
+                .collect(Collectors.toSet());
+    }
+
+    private static ClassPathScanningCandidateComponentProvider getInstance(){
+        if (scanner == null){
+            scanner = new ClassPathScanningCandidateComponentProvider(false);
+        }
+        return scanner;
+    }
+
+}