2016-05-24 14 views
0

Ich habe verschiedene Arten von Provider (Schnittstelle) Klassen sagen ProviderA, ProviderB und so weiter. In einer normalen Welt, würde ich eine Klasse erstellen, genannt ProviderFactory so dassRichtiger Weg zur Implementierung von Fabriken in Spring Framework

public class ProviderFactory{ 
    public Provider getProviderByName(String providerName){ 
     for (Provider provider : availableProviders){ 
      if (provider.getName.equalIgnoreCase(providerName)){ 
       return provider; 
      } 
     } 
     return null; 
    } 
} 

Nun, was ich wissen will, dass dort jede annotations hat mir diese Fabrik Klassen in Singleton Art und Weise verwenden zu helfen? Diese Factories sind statischer Natur und können zur Anwendungslaufzeit konfiguriert werden. Also ich suche hier eine Singleton-Implementierung.

Antwort

1

@Component/@Service/@Repository/@Controller/@RestController verwenden Singleton Umfang standardmäßig.

0

Sie können eine Fabrik Muster im Frühjahr implementieren, wie unten dargestellt:

@Component 
    public class ProviderFactory { 

     @Autowired 
     private ProviderA providerA; 

     @Autowired 
     private ProviderB providerB; 


     public static Provider getProviderByName(String providerName) { 
      if (providerName.equalsIgnoreCase("providerA")) { 
       return providerA; 
      } else if (providerName.equalsIgnoreCase("providerB")) { 
       return providerB; 
      } 
     } 
    } 
0

Wenn Sie jede Provider Klasse mit einem der Klischee Anmerkungen Anmerkungen versehen (@Component, @Service, @Repository, @Controller oder @RestController), dann können Sie @Autowire sie in Ihrem Werk:

@Component 
public class ProviderFactory { 

    @Autowired 
    private List<Provider> availableProviders; 

    public Provider getProviderByName(String providerName) { 
     for (Provider provider : availableProviders) { 
      if (provider.getName.equalIgnoreCase(providerName)){ 
       return provider; 
      } 
     } 
     return null; 
    } 
} 

beabsichtigen jedoch, wenn Sie Ihre Provider Instanzen in anderen zu verwenden, Frühlingsbohnen, würde ich empfehlen, @Qualifier in Verbindung mit @Autowire zu verwenden, um Spring zu lösen, welche Instanz zu verwenden, z.

@Component 
public class ClassThatDependsOnSpecificProvider { 

    @Autowired 
    @Qualifier("providerA") 
    private Provider providerA; 

} 

Mehr Infos über @Qualifier können im Fine-tuning annotation-based autowiring with qualifiers Kapitel in der Frühling Referenz docs finden.

Verwandte Themen