如何检索自定义注释字段?

How to retrieve custom annotation fields?

我想实现一个可以应用于 class(一旦进入应用程序)的自定义注释,以启用一项功能(访问远程资源)。如果此注解放在任何配置 class 上,它将设置整个应用程序的访问权限。到目前为止并没有那么难(见下面的示例),但我想在 @interface 中包含一些定义字段,这些字段将在访问建立过程中使用。

例如,Spring 有一些非常相似的东西:@EnableJpaRepositories。启用对数据库的访问,注释中的参数包含定义。例如:@EnableJpaRepositories(bootstrapMode = BootstrapMode.DEFERRED)

到目前为止,我有:

要仅创建访问,我正在使用类似的东西:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(AccessHandlerConfiguration.class)
public @interface EnableAccessHandlerAutoconfigure {
    String name() default "";
}

使用它:

@EnableAccessHandlerAutoconfigure{name="yoni"}
@Configuration
public class config {}

AccessHandlerConfiguration 是一个包含建立连接的 bean 的配置 class。

我遇到的问题是我不知道如何检索字段名称的值。我该怎么办?

检索值可以按如下方式完成:

this.getClass().getAnnotation(EnableAccessHandlerAutoconfigure.class).name()

使用实际示例配置 class 扩展我的评论:

@EnableAccessHandlerAutoconfigure(name="yoni")
@Configuration
public class SomeConfiguration {
    @Bean
    SomeBean makeSomeBean() {
        return new SomeBean(this.getClass().getAnnotation(EnableAccessHandlerAutoconfigure.class).name());
    }
}

name的值就是这样得到的,至于接下来要做什么,就看你自己了。

研究了半天,找到了一个方法:Spring的ApplicationContext中有一个方法是根据bean的注解getBeanNamesForAnnotation获取bean的名字,然后获取注解本身 findAnnotationOnBean,然后只需使用字段 getter.

@Configuration
public class AccessHandlerConfiguration {

    private final ApplicationContext applicationContext;

    public AccessHandlerConfiguration(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;        
        String[] beansWithTheAnnotation = applicationContext.getBeanNamesForAnnotation(EnableRabbitAutoconfigure.class);

        for (String beanName : beansWithTheAnnotation) {
            EnableRabbitAutoconfigure annotationOnBean = applicationContext.findAnnotationOnBean(beanName, EnableRabbitAutoconfigure.class);
            System.out.println("**********" + beanName + "*********************" + annotationOnBean.name() + "*******************");
        }
    }
}

结果:

**********config*********************yoni*******************