Aujourd'hui, j'ai discuté avec mes collègues si je dois utiliser la combinaison de @configuration et @bean pour créer un bean ou utiliser directement @Service et d'autres annotations pour la placer sur la classe. L'auteur a tendance à utiliser le premier type, à savoir la combinaison de @configuration et @bean.
Regardons d'abord un exemple, l'objectif est de créer un haricot de service de recherche.
Utilisez directement @Service:
// searchService.javapackage li.koly.search; import java.util.list; interface publique SearchService {list <objet> search (String Q);} // elasticsearchServiceImpl.javapackage li.koly.search; importer org.spriceframework.stereotype.service; import java.artil.arrays; java.util.list; @ServiceComponentPublic class elasticsearchServiceImpl implémente SearchService {@Override public list <objet> search (String q) {return arrays.aslist ("hello", q); }} // application.javapackage li.koly.search; import org.springframework.beans.factory.annotation.autowired; import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.springbootApplication; Importwork. org.springframework.web.bind.annotation.getMapping; import org.springframework.web.bind.annotation.restController; import java.util.list; @ SpringbootApplication @ RestControllerPublic Class application {@autowired private SearchServiceService; @Getmapping ("/ search") public list <objet> Bonjour (chaîne q) {return searchService.Search (q); } public static void main (String [] args) {springApplication.run (application.class, args); }}Démarrer l'application, Accès du navigateur: http: // localhost: 8081 / search? Q = koly, affichage de la page: ["bonjour", "koly"]
Comment utiliser @configuration et @Bean:
// elasticsearchServiceImpl.javapackage li.koly.search; import java.util.arrays; import java.util.list; public class elasticsearchServiceImplt implémente SearchService {@Override public list <Object> search (string q) {return arrays.aslist ("Hello", q); }} // appconfig.javapackage li.koly.search; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; @configurationPublic class appconfig {@Bean public SearcherService () {return new ellasticSersevice ();); }}Par rapport au code qui utilise directement @Service, il existe une classe AppConfig et l'annotation @Service placée sur elasticsearchServiceImpl est supprimée. À première vue, il y a plus de codes et de classes. Alors, quels sont les avantages d'utiliser ce dernier?
L'auteur estime que les avantages sont:
Séparation des préoccupations
En utilisant @configuration et @bean, la création de haricots est placée en un seul endroit, et l'interface et son implémentation n'ont rien à voir avec la création de haricots.
Si la création du bean doit être modifiée, vous n'avez qu'à afficher et modifier la classe de configuration correspondante, et vous n'avez pas besoin d'aller au bean Java correspondant pour les modifications. Par exemple, parfois la création de Beans nécessite une coopération avec @Scope ou @Profile, et vous n'avez qu'à modifier la classe de configuration pour le moment.
Responsabilité unique
L'annotation @Service elle-même assume deux responsabilités:
L'une est la création de haricots;
La seconde consiste à identifier une classe en tant que service.
Indique qu'une classe annotée est un "service", à l'origine défini par
Design (Evans, 2003) comme "une opération offerte comme une interface qui se situe seule dans le modèle, sans état encapsulé".
Ce qui précède est l'explication de Spring de l'annotation @Service. C'est-à-dire que @Service représente en fait une opération apatride et indépendante fournie dans DDD.
En utilisant la méthode de @bean et @configuration, la création du bean est remise à une classe distincte, et l'identité de service est remise à l'interface et au nom de classe en Java. Cela se reflète également dans les données de printemps. Par exemple, le référentiel est identifié par nom, tel que CruDrepository. Par conséquent, le service est également reflété par son nom. La définition spécifique de la hiérarchie, à travers le nom, sans s'appuyer sur les annotations fournies par le printemps, est pratique pour fournir plus de hiérarchies selon le projet, tels que la couche de mappeur, la couche validatrice, etc.
De plus, le haricot et le service sont deux dimensions. L'un concerne la mise en œuvre concrète et l'autre concerne les concepts dans DDD.
Plus flexible
En utilisant @Bean, vous pouvez créer des instances de classes dans la bibliothèque. Si vous utilisez @Service, vous ne pouvez pas ajouter @Service Annotation à la classe correspondante de la bibliothèque.
moindre connaissance (principe de connaissance minimum)
Le principe de connaissance minimum signifie:
Moins la technologie ou les connaissances nécessaires pour remplir la fonction, mieux c'est, afin de s'assurer que le projet est simple et de réduire la difficulté d'apprendre le projet.
Étant donné que l'utilisation de @Service ne peut pas créer une instance d'une classe dans la bibliothèque de classe, lorsque vous rencontrez des exigences similaires, vous devez utiliser le formulaire de @configuration et @bean. Pour le moment, des annotations telles que @Service, @configuration et @bean existent dans tout le projet en même temps, et les choses que ces annotations font sont les mêmes, c'est-à-dire la création du haricot.
Avec @Service, il est très probable que @Service, @Component, @Configuration et @Bean existent simultanément.
Lorsque vous utilisez @configuration et @Bean, vous pouvez ignorer complètement @Service et @Component, qui est conforme au principe de la connaissance minimale.
Enfin, en passant, le bean de Spring a été créé dans XML auparavant, et Java a été utilisé pour la configuration plus tard. La raison principale de ne pas utiliser XML est que XML n'est pas assez concis et n'a pas de fonctions telles que la vérification du temps de compilation, plutôt que de diffuser la création de haricots dans diverses classes.
En résumé, l'auteur préfère utiliser @configuration et @bean.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.