2016-08-11 1 views
1

Ich versuche, meine eigene @ EnableXxx-style-Annotation (nämlich @EnableCustomizedPropertySources) zu erstellen. Dazu importiert die Annotation die Klasse CustomizedPropertySourcesConfiguration, die wiederum ImportAware implementiert, um Zugriff auf Attribute der Annotation @EnableCustomizedPropertySources zu erhalten.Kann ImportAware von Spring nicht arbeiten

Annotation:

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
@Import(CustomizedPropertySourcesConfiguration.class) 
public @interface EnableCustomizedPropertySources { 

    String externalFolderName(); 

    String propertiesFileName(); 

    (...) 
} 

importierte Konfigurationsklasse:

@Configuration 
public class CustomizedPropertySourcesConfiguration implements ImportAware { 

    protected AnnotationAttributes enableCustomizedPropertySourcesAttributes; 

    @Override 
    public void setImportMetadata(AnnotationMetadata importMetadata) { 
     Map<String, Object> attributes = importMetadata.getAnnotationAttributes(EnableCustomizedPropertySources.class.getName(), false); 
     this.enableCustomizedPropertySourcesAttributes = AnnotationAttributes.fromMap(attributes); 
    } 

    @Bean 
    public PropertySourcesPlaceholderConfigurer propertySource() { 
     return (...); 
    } 
} 

Das Problem ist, wird das Verfahren setImportMetadata nicht von Spring aufgerufen, wenn ich einige @Configuration Klasse mit meiner @EnableCustomizedPropertySources Anmerkung Anmerkungen versehen, so Ich kann nicht auf die Annotationsattribute zugreifen.

+0

ich, dass ImportAware Schnittstelle sehen kann durch ConfigurationClassPostProcessor.ImportAwareBeanPostProcessor gehandhabt wird, die über eine integrierte in BeanPostProcessor des Frühlings ist. Es stellt sich heraus, dass meine Klasse CustomizedPropertySourcesConfiguration oben nicht als Bean betrachtet wird (tatsächlich, soweit ich das verstehe, sind '@Konfigurations'-Klassen nicht selbst), aber beim Debuggen mit anderen '@ EnableXxx'-Annotationen von Spring die' @ Die von ihnen importierten Konfigurationsklassen werden von diesem BeanPostProcessor tatsächlich behandelt. – jgslima

+0

Konnten Sie das beheben? Ich habe das gleiche Problem ... –

+0

In gewisser Weise. Ich kann immer noch nicht mit Spring Boot arbeiten, aber es funktionierte mit Nicht-Boot-Anwendungen. Ich habe versucht, den Spring-Code tiefer zu debuggen, aber es wurde zu tief, um es zu verstehen. Meine einzige Vermutung ist, dass es einen Unterschied geben muss, wenn Boot Klassen auswählt, die zu Beans werden müssen. Wenn ConfigurationClassPostProcessor.ImportAwareBeanPostProcessor aufgerufen wird, wird die Konfigurationsklasse, die ImportAware implementiert, nicht als Bean betrachtet und daher nicht verarbeitet. – jgslima

Antwort

0

Die ImportAware Klasse (CustomizedPropertySourcesConfiguration) braucht beides: @Configuration @Component