2015-02-17 13 views
5

autowire Haben Sie eine Möglichkeit, Bean in Bedingung zu autowire?Wie Eigenschaften Eigenschaften Bean aus Bedingung

Es gibt ein nächstes Beispiel. Wir haben 2 Implementierung von FileManager. Eine der Implementierungen sollte initialisiert werden, hängt von der Eigenschaft 'Plattform' ab. Eigenschaften Griffe über Archaius.

@Component 
public class AwsPlatformCondition implements Condition { 

    @Autowired 
    private ArchaiusProperties archaiusProperties; 

    @Override 
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { 
     return "aws".equalsIgnoreCase(archaiusProperties.getStringProperty(PropertiesMapper.PLATFORM)); 
    } 
} 

.

@Component 
public class StandardPlatformCondition implements Condition { 

    @Autowired 
    private ArchaiusProperties archaiusProperties; 

    @Override 
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { 
     return "standard".equalsIgnoreCase(archaiusProperties.getStringProperty(PropertiesMapper.PLATFORM)); 
    } 
} 

.

@Component 
@Conditional(AwsPlatformCondition.class) 
public class AS3FileManager implements FileManager { 
... 
} 

.

@Component 
@Conditional(StandardPlatformCondition.class) 
public class NativeFileManager implements FileManager { 
... 
} 

Dieser Code funktioniert nicht. Der Hauptgrund dafür ist, dass die ArchaiusProperties-Bean nicht initialisiert wird, wenn die Bedingung übereinstimmt. Gibt es eine Möglichkeit, die ArchaiusProperties-Bean zu initialisieren, bevor Sie sie in einem Zustand verwenden?

Antwort

4

Wenn wir einen Blick auf java docs für Condition Schnittstelle -

Bedingungen müssen die gleichen Einschränkungen wie BeanFactoryPostProcessor folgen und darauf achten, nie mit Bean-Instanzen in Wechselwirkung treten.

Die Beschränkungen sind (von java docs von BeanFactoryPostProcessor)

A BeanFactoryPostProcessor mit interagieren kann und Bohnen Definitionen, aber nie Bean-Instanzen zu ändern. Dies kann zu vorzeitigen Bean-Instanziierungen führen, die den Container verletzen und unbeabsichtigte Nebenwirkungen verursachen.

Also was Sie versuchen zu erreichen ist etwas nicht empfohlen; Nebenwirkungen, die bereits aufgetreten sind.

aber wenn wir weiter in docs graben für Condition bekommen wir

Für weitere feinkörnige Steuerung von Bedingungen, die mit @Configuration Bohnen interagieren betrachten die ConfigurationCondition Schnittstelle.

Auch hier sind die Einschränkungen in Verletzung. Also alles in allem mit Condition in diesem Szenario ist keine gute Idee.

Also IMO die beste Wette für Sie ist mit @Profile gehen, wo Sie das gewünschte Profil auf einmal aktivieren und die jeweilige Bean verwenden können; ohne die Schnickschnack zu beachten.

+1

Danke! Jetzt denke ich eigentlich, dass @Conditional nicht der beste Weg für mich ist. – biven

+0

Das Festlegen des Profils hängt von dem Ergebnis ab, das von der Methode im Bean 'ArchaiusProperties' zurückgegeben wird. Wie ist es möglich? Auch sagt das erwähnte Javadoc nicht, dass Sie tatsächlich innerhalb der 'ConfigurationCondition' auf Beans verweisen können? –

Verwandte Themen