2017-10-04 75 views
0

我有一个配置,它的@Import - 由注释。我希望配置可以访问注释中的值。这可能吗?有没有办法在Spring Boot中将注释的值传递给我的配置?

配置:

@Configuration 
public class MyConfig 
{ 
    @Bean 
    public CacheManager cacheManager(net.sf.ehcache.CacheManager cacheManager) 
    { 
     //Get the values in here 

     return new EhCacheCacheManager(cacheManager); 
    } 

    @Bean 
    public EhCacheManagerFactoryBean ehcache() { 
     EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean(); 
     ehCacheManagerFactoryBean.setShared(true); 

     return ehCacheManagerFactoryBean; 
    } 
} 

注释

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@Import(MyConfig.class) 
public @interface EnableMyCaches 
{ 
    String value() default ""; 
    String cacheName() default "my-cache"; 
} 

我将如何得到我的配置如下传递的价值?

@SpringBootApplication 
@EnableMyCaches(cacheName = "the-cache") 
public class MyServiceApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(MyServiceApplication.class, args); 
    } 
} 

回答

1

使用简单的Java反射:

Class c = MyServiceApplication.getClass(); 
EnableMyCaches enableMyCaches = c.getAnnotation(EnableMyCaches.class); 
String value = enableMyCaches.value(); 
+0

这需要我的代码预先知道我的注解类的名称。但是,如果我的类是包含作为依赖jar我不知道 –

0

考虑之类的东西@EnableConfigurationProperties是如何实现的。

注释有@Import(EnableConfigurationPropertiesImportSelector.class)which然后输入ImportBeanDefinitionRegistrar s。这些注册传递注释元数据:

public interface ImportBeanDefinitionRegistrar { 

    public void registerBeanDefinitions(
      AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry); 

} 

然后你可以从注解注释元数据属性:

MultiValueMap<String, Object> attributes = metadata 
       .getAllAnnotationAttributes(
         EnableMyCaches.class.getName(), false); 
attributes.get("cacheName"); 
相关问题