2015-02-17 7 views
5

Qualcuno ha il modo di autorizzare il bean in Condition?Come valorizzare il bean delle proprietà da Condizione

C'è un prossimo esempio. Abbiamo 2 implementazione di FileManager. Una delle implementazioni dovrebbe essere inizializzata in base alla "piattaforma" di proprietà. Proprietà gestisce tramite 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 { 
... 
} 

Questo codice non funziona. Il motivo principale è perché il bean ArchaiusProperties non viene inizializzato quando le condizioni corrispondono. Ha un modo per inizializzare il bean ArchaiusProperties prima di usarlo in condizioni?

risposta

4

Se abbiamo uno sguardo a java docs per Condition interfaccia -

condizioni devono seguire le stesse restrizioni BeanFactoryPostProcessor e aver cura di non interagire con le istanze di fagioli.

Le restrizioni sono (da java docs di BeanFactoryPostProcessor)

Un BeanFactoryPostProcessor Interazioni e modificare le definizioni di fagioli, ma mai casi di fagioli. Ciò potrebbe causare un'anticipazione dei fagioli prematura, violando il contenitore e causando effetti collaterali indesiderati.

Quindi quello che sta cercando di ottenere è qualcosa non raccomandato; effetti collaterali di cui già si sono incontrati.

Tuttavia, se si scava ulteriormente nei documenti per Condition otteniamo

Per un controllo più capillare delle condizioni che interagiscono con i fagioli @Configuration considerare l'interfaccia ConfigurationCondition.

Anche in questo caso le restrizioni sono in violazione. Quindi tutto sommato utilizzando Condition in questo scenario non è una buona idea.

Quindi IMO la soluzione migliore per te è andare con @Profile in cui è possibile attivare il profilo desiderato alla volta e utilizzare il rispettivo bean; senza considerare i fronzoli allegati.

+1

Grazie! Ora penso che @Conditional non sia il modo migliore per me. – biven

+0

L'impostazione del profilo dipenderà dal risultato restituito dal metodo nel bean 'ArchaiusProperties'. Come è possibile? Inoltre, il Javadoc citato non dice che in realtà puoi fare riferimento ai bean all'interno di 'ConfigurationCondition'? –

Problemi correlati