Je me demande comment utiliser la classe abstraite usine de mise en œuvre en tant que @Service dans mon application. J'ai ai plusieurs fournisseurs de ma logique voulue et les injectais par le constructeur. Le problème est que je ne suis pas sûr de mon usine devrait résister à avoir le constructeur et si elle devrait, devrait-il être privé.
J'ai annoté cette classe comme @Service mais je me demandais si tout cela est bon et quelles sont les meilleures pratiques. Merci et désolé si le est supérieur un gâchis, c'est en fait ma première question et après.
Voici mon extrait de code:
private final FirstClient first;
private final SecondClient second;
private SentimentFactoryImpl(FirstClient first, SecondCliend second) {
this.first = first;
this.second = second;
}
@Override
public SentimentClient get(String clientName) {
if ("First".equalsIgnoreCase(clientName)) {
return this.first;
} else if ("Second".equalsIgnoreCase(clientName)) {
return this.second;
}
throw new UnknownClientException("Service doesn't provide support for client: " + clientName);
}
En fait , le cœur du cadre du printemps est une sorte de fabrique abstraite super flexible et puissant. Si vous utilisez Spring vous devez déléguer toutes les fonctionnalités de classe créationnelle au coeur du printemps. Dans votre cas , je préfère utiliser Java Spring Configurations
pour la création de classe. L'équivalent de votre usine au printemps semblera comme ça.
@Configuration
public class ServiceConfig {
@Bean
public SentimentClient firstClient() {
return new FirstClient();
}
@Bean
public SentimentClient secondClient() {
return new SecondClient();
}
}
Après cette classe a été reconnue par le noyau du printemps , il utilisera comme une usine pour obtenir l'instance du service chaque fois que tout autre besoin de haricots de printemps il. Vous n'avez pas besoin d'appeler une sorte de get
méthode comme dans votre usine. Le printemps fait automatiquement.
@Service
public class SomeService {
private final SentimentClient firstClient;
@Autowired
private SomeService(SentimentClient firstClient) {
this.firstClient = firstClient;
}
// Some business logic here
}
La peine de mentionner que le nom de la méthode d'usine en configuration Spring est le nom de la fève (service) créé par cette méthode et ce nom avec le type de classe est utilisée pour trouver la fève nécessaire pour Autowiring.