我正在制作一个与 Spring Boot 一起使用的库。这个库定义了一些可以在方法中使用的注解。
如何(在运行时)找到正在使用该库的应用程序包?
我需要这个来扫描带注释的方法。
我正在制作一个与 Spring Boot 一起使用的库。这个库定义了一些可以在方法中使用的注解。
如何(在运行时)找到正在使用该库的应用程序包?
我需要这个来扫描带注释的方法。
您可以实现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
条件块内收集类或元信息