java springboot Reflections工具扫描项目中带有某个注解的方法(类似@SpringBootApplication扫描各种注解)
文章目录
- java springboot Reflections工具扫描项目中带有某个注解的方法(类似@SpringBootApplication扫描各种注解)
- 简单示范
- @EnableDistributeDelayTask配置路径扫描示范(类似于@SpringBootApplication)
java springboot Reflections工具扫描项目中带有某个注解的方法(类似@SpringBootApplication扫描各种注解)
简单示范
// 要扫描的包路径
String[] scanPackages = new String[]{"cn.humorchen.delaytask"};
// 创建过滤器
FilterBuilder filterBuilder = new FilterBuilder();
for (String scanPackage : scanPackages) {// 添加要扫描的包路径filterBuilder.includePackage(scanPackage);
}
// 创建扫描配置
Configuration configuration = new ConfigurationBuilder().forPackages(scanPackages).filterInputsBy(filterBuilder).setScanners(Scanners.MethodsAnnotated);
// 使用Reflections 进行扫描
Reflections reflections = new Reflections(configuration);
// 获得加了DelayTask注解的方法
Set<Method> methodsAnnotatedWithDelayTask = reflections.getMethodsAnnotatedWith(DelayTask.class);
@EnableDistributeDelayTask配置路径扫描示范(类似于@SpringBootApplication)
public void scanProjectTask() {// 状态切换CASif (INIT.compareAndSet(false, true)) {// 要扫描的包路径HashSet<String> scanPackageSet = new HashSet<>();// 通过上下文拿加了启用注解的BeanMap<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(EnableDistributeDelayTask.class);for (Object bean : beansWithAnnotation.values()) {// 获取注解EnableDistributeDelayTask enableDistributeDelayTask = AnnotationUtil.getAnnotation(bean.getClass(), EnableDistributeDelayTask.class);// 将注解中配置的扫描路径加入集合if (enableDistributeDelayTask != null && enableDistributeDelayTask.scanPackages() != null && enableDistributeDelayTask.scanPackages().length > 0) {scanPackageSet.addAll(Arrays.asList(enableDistributeDelayTask.scanPackages()));}// 将bean当前路径加入集合scanPackageSet.add(bean.getClass().getPackage().getName());}String[] scanPackages = scanPackageSet.toArray(new String[0]);// 构建过滤器构造器FilterBuilder filterBuilder = new FilterBuilder();for (String scanPackage : scanPackages) {// 将每个包加入其中filterBuilder.includePackage(scanPackage);}// 构建配置Configuration configuration = new ConfigurationBuilder().forPackages(scanPackages).filterInputsBy(filterBuilder).setScanners(Scanners.MethodsAnnotated);// 创建反射工具对象ReflectionsReflections reflections = new Reflections(configuration);//扫描所有加了注解的方法Set<Method> methodsAnnotatedWithDelayTask = reflections.getMethodsAnnotatedWith(DelayTask.class);// 遍历这些方法for (Method method : methodsAnnotatedWithDelayTask) {// 拿到注解DelayTask delayTaskAnnotation = AnnotationUtil.getAnnotation(method, DelayTask.class);if (delayTaskAnnotation != null) {// 执行加载逻辑String taskName = delayTaskAnnotation.value();checkTaskMethodArgsAndReturnType(taskName, method);checkTaskNameConflict(taskName, method);taskNameSet.add(taskName);methodMap.put(taskName, method);annotationMap.put(taskName, delayTaskAnnotation);}}} else {log.warn("【DistributeDelayTask】 DistributeDelayTaskServiceImpl has been initialized, skip scanProjectTask");}}
AnnotationUtil 见博客
https://humorchen.blog.csdn.net/article/details/139798211