Autowire tous les composants dans un ensemble sans mettre en œuvre une interface

la variole:

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?

davidxxx:

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> repositoryInterfaceou ApplicationContextvous faire perdre le bénéfice de contrôles de dépendance effectués par le conteneur Spring au démarrage qui empêche NullPointerExceptionet les erreurs liées à l' incohérence (dépendance manquante) pendant le travail d'application.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=231956&siteId=1
conseillé
Classement