0

我正在制作一个与 Spring Boot 一起使用的库。这个库定义了一些可以在方法中使用的注解。

如何(在运行时)找到正在使用该库的应用程序包?
我需要这个来扫描带注释的方法。

4

1 回答 1

1

您可以实现BeanFactoryPostProcessor
1. 使用ConfigurableListableBeanFactory您可以迭代BeanDefinition
2. 确定 bean 是否class您的注释
3. 从 bean 的class名称中获取包

例子:

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        Set<String> packages = findAnnotationUsagePackages(MyAnnotation.class, beanFactory);
        ...
    }

    private Set<String> findAnnotationUsagePackages(Class<? extends Annotation> annotationClass,
                                                    ConfigurableListableBeanFactory beanFactory) {
        Set<String> annotationUsagePackages = new HashSet<>();

        for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {
            BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanDefinitionName);

            if (beanDefinition instanceof ScannedGenericBeanDefinition) {
                ScannedGenericBeanDefinition genericBeanDefinition = (ScannedGenericBeanDefinition) beanDefinition;

                if (AnnotationUtils.isCandidateClass(genericBeanDefinition.getBeanClass(), annotationClass)) {
                    String beanClassName = genericBeanDefinition.getBeanClassName();

                    if (beanClassName != null) {
                        annotationUsagePackages.add(ClassUtils.getPackageName(beanClassName));

                    }
                }
            }
        }
        return annotationUsagePackages;
    }

}

关于AnnotationUtils.isCandidateClass()

确定给定的类是否是携带指定注解的候选者(在类型、方法或字段级别)

还要注意AbstractBeanDefinition.getBeanClass()

抛出: IllegalStateException - 如果 bean 定义没有定义 bean 类,或者指定的 bean 类名还没有被解析为实际的 Class

PS你也可以在AnnotationUtils.isCandidateClass条件块内收集类或元信息

于 2019-11-18T21:29:21.577 回答