2017-10-04 79 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"); 
相關問題