有一个本地任务 - 查找带有自定义注释的方法,其本质在于标记。也就是说,如果此注解存在于方法上,则保存该方法的名称以供后续使用。通过枚举 ApplicationContext 中的 bean 及其方法,并为方法搜索所需的注解,该任务很容易解决。但是只要需要的方法有@Async注解,那么isAnnotationPresent就表明没有这个注解,而且确实该方法没有任何注解,包括@Async。更有趣的是,如果类中有几个方法带有所需的注解,并且该类的其中一个方法具有@Async注解,那么上述搜索注解的方法即使对于未标记的方法也显示它们不存在与@Async。问题是,如何在项目中找到所有带有所需注释的方法?
实验搜索类注解:
@Component
@Slf4j
@EnableAsync
public class BeanFinder {
private final ApplicationContext applicationContext;
public BeanFinder(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@EventListener(ApplicationReadyEvent.class)
public void findBean() {
log.info("find async");
Arrays.stream(applicationContext.getBeanDefinitionNames()).
forEach(x -> Arrays.stream(applicationContext.getBean(x).getClass().getDeclaredMethods())
.filter(y -> y.isAnnotationPresent(Annotation1.class)).forEach(y -> log.info(y.getName())));
}
}
实验注释:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Annotation1 {
}
带有方法的实验类:
@Component
public class BeanAsync {
@Async
@Annotation1
public void method1Async() {
}
@Annotation1
public void method2() {
}
public void method3() {
}
@Async
public void method4() {
}
}