2015-02-17 12 views
5

Czy ktoś ma możliwość automatyzacji fasoli w warunku?Jak zautomatyzować fasolę właściwości z warunku

Istnieje kolejny przykład. Mamy 2 implementacje FileManager. Jedna z implementacji powinna zostać zainicjowana w zależności od platformy właściwości. Właściwości obsługuje 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 { 
... 
} 

Ten kod nie działa. Głównym powodem jest to, że komponent bean ArchaiusProperties nie został zainicjowany po spełnieniu warunku. Czy ktokolwiek może zainicjować komponent bean ArchaiusProperties przed użyciem go w stanie?

Odpowiedz

4

Jeśli spojrzeć na java docs dla Condition interfejs -

warunki musi spełniać te same ograniczenia jak BeanFactoryPostProcessor i dbać, aby nie wchodzić w interakcje z instancji fasoli.

Ograniczenia są (z java docs z BeanFactoryPostProcessor)

BeanFactoryPostProcessor może rozmawiać i zmieniania definicji bean, ale nieprzypadki fasoli. Może to spowodować przedwczesne tworzenie błony, naruszenie pojemnika i wywoływanie niezamierzonych efektów ubocznych.

To, co próbujesz osiągnąć, to coś, czego nie jest zalecane ; skutki uboczne, które już zostały napotkane.

Jednak jeśli będziemy kopać dalej w docs dla Condition otrzymujemy

Więcej drobnoziarnistej kontroli warunków, które współdziałają z @Configuration fasoli uwzględniać interfejs ConfigurationCondition.

Tutaj także ograniczenia są z naruszeniem. Tak więc w sumie przy użyciu Condition w tym scenariuszu nie jest dobrym pomysłem.

Najlepszym rozwiązaniem dla IMO jest skorzystanie z @Profile, w którym można aktywować żądany profil na raz i korzystać z odpowiedniego komponentu; bez uwzględnienia przywiązanych dodatków.

+1

Dzięki! Teraz uważam, że @Conditional nie jest dla mnie najlepszym sposobem. – biven

+0

Ustawienie profilu zależy od wyniku zwróconego przez metodę w komponencie bean "ArchaiusProperties". Jak to jest możliwe? Ponadto, czy cytowany Javadoc nie mówi, że rzeczywiście można odnosić się do fasoli w 'ConfigurationCondition'? –

Powiązane problemy