Je suis un projet avec des tonnes de services et dépôts. Actuellement, chaque dépôt est autowired à un service à l'aide d'annotations.
@Service
public class Service1 {
@Autowired
private Repository1 repository1;
@Autowired
private Repository2 repository2;
...100+ more
}
Tous ces référentiels sont dans le même paquet. Est - il possible de sauter la déclaration pour chaque dépôt?
Une solution simple je l'ai trouvé serait d'implémenter une interface comme celle-ci:
@Autowired
private Map<String,RepositoryInterface> repositoryInterface
public void method1(){
repositoryInterface.get("repository1").doMethod();
}
Il aurait dû être une bonne solution mais le problème est que je n'ai pas accès à tous les codes sources. J'ai des tonnes de classes dépôt que je ne suis pas autorisé à changer d'ajouter une classe d'interface.
Donc, il y a une autre façon de résoudre ce problème? Comme scannez le paquet entier et juste utiliser le nom de haricots pour accéder aux dépôts?
Les haricots sont accessibles à partir de leur classe ou leur nom (et les deux).
Dans votre cas, vous pouvez compter directement sur leur classe pour les récupérer à partir du contexte.
Injecter un ApplicationContext
(ou moyen de constructeur):
@Autowired
private ApplicationContext applicationContext;
Et l'utiliser:
applicationContext.getBean(RepositoryOne.class).doMethod1();
Idéalement, il doit être extrait dans une méthode:
public <T> T getRepository(Class<T> clazz){
return applicationContext.getBean(clazz);
}
être plus simplement utilisé:
getRepository(RepositoryOne.class).doMethod(1);
Mais je garde contre besoin tant de dépendances sur le terrain dans une classe.
Cela rend très difficile de maintenir / à tester et erreur aussi très enclin à utiliser.
La meilleure chose à faire est de repenser votre conception pour éviter cette classe complexe / ballonnement.
Outre l' utilisation de la structure comme private Map<String,RepositoryInterface> repositoryInterface
ou ApplicationContext
vous faire perdre le bénéfice de contrôles de dépendance effectués par le conteneur Spring au démarrage qui empêche NullPointerException
et les erreurs liées à l' incohérence (dépendance manquante) pendant le travail d'application.