如何检索自定义注释字段?
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*******************
我想实现一个可以应用于 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*******************