A quoi sert exactement Spring Framework?

J’entends beaucoup parler du spring , les gens disent sur le web que Spring est un bon cadre pour le développement web. A quoi sert exactement Spring Framework? Comment puis-je l’utiliser pour le développement d’applications Web-Java? des exemples?

À la base, Spring est un framework pour l’ dependency injections , qui permet de construire des systèmes très découplés.

Le problème

Par exemple, supposons que vous deviez lister les utilisateurs du système et déclarer ainsi une interface appelée UserLister :

 public interface UserLister { List getUsers(); } 

Et peut-être une implémentation accédant à une firebase database pour obtenir tous les utilisateurs:

 public class UserListerDB implements UserLister { public List getUsers() { // DB access code here } } 

À votre avis, vous devrez accéder à une instance (par exemple, rappelez-vous):

 public class SomeView { private UserLister userLister; public void render() { List users = userLister.getUsers(); view.render(users); } } 

Notez que le code ci-dessus n’a pas initialisé la variable userLister . Que devrions nous faire? Si j’instancier explicitement l’object comme ceci:

 UserLister userLister = new UserListerDB(); 

… Je couplerais la vue avec mon implémentation de la classe qui accède à la firebase database. Que faire si je veux passer de l’implémentation de la firebase database à une autre qui obtient la liste d’utilisateurs à partir d’un fichier séparé par des virgules (rappelez-vous, c’est un exemple)? Dans ce cas, je retournerais à mon code et changerais la dernière ligne en:

 UserLister userLister = new UserListerCommaSeparatedFile(); 

Cela n’a pas de problème avec un petit programme comme celui-ci mais … Que se passe-t-il dans un programme qui a des centaines de vues et un nombre similaire de classes professionnelles? La maintenance devient un cauchemar!

Approche de spring (dependency injection)

Ce que fait Spring est de relier les classes en utilisant un fichier XML ou des annotations. Ainsi, tous les objects sont instanciés et initialisés par Spring et injectés aux bons endroits (Servlets, Web Frameworks, Business Class, DAO, etc., etc.). …).

Pour revenir à l’exemple du spring, il suffit d’avoir un setter pour le champ userLister et d’avoir soit un fichier XML comme ceci:

     

ou plus simplement annoter le @Inject dans notre classe de vue avec @Inject :

 @Inject private UserLister userLister; 

De cette façon, lorsque la vue est créée, elle aura comme par magie un UserLister prêt à fonctionner.

 List users = userLister.getUsers(); // This will actually work // without adding any line of code 

C’est super! N’est-ce pas?

  • Que faire si vous souhaitez utiliser une autre implémentation de votre interface UserLister ? Changez simplement le XML
  • Et si une implémentation UserLister n’est pas prête? Programmer une implémentation temporelle de UserLister et faciliter le développement de la vue
  • Et si je ne veux plus utiliser Spring? Ne l’utilise pas! Votre application n’y est pas couplée. Inversion of Control déclare: “L’application contrôle le framework, pas le framework contrôle l’application”.

Il y a d’autres options pour Dependency Injection, ce qui à mon avis a rendu Spring si célèbre en plus de sa simplicité, son élégance et sa stabilité, c’est que les gars de SpringSource ont programmé beaucoup de POJOs pour intégrer Spring intrusif dans votre application. De plus, Spring a plusieurs bons sous-projets tels que Spring MVC, Spring WebFlow, Spring Security et, encore une fois, une longue liste de produits, etc.

J’espère que cela t’aides. Quoi qu’il en soit, je vous encourage à lire l’article de Martin Fowler sur l’dependency injection et l’inversion du contrôle, car il le fait mieux que moi. Après avoir compris les bases, jetez un coup d’œil à la documentation de Spring , à mon avis, c’est le meilleur livre de spring de tous les temps.

Spring contient ( comme l’a justement souligné Skaffman ) un framework MVC. En bref, voici mes consortingbutions. Spring prend en charge la séparation de la couche de service, de la couche Web et de la couche de gestion, mais le mieux est l’injection d’objects. Donc, pour expliquer cela avec un exemple, considérez l’exemple ci-dessous:

 public interface FourWheel { public void drive(); } public class Sedan implements FourWheel { public void drive() { //drive gracefully } } public class SUV implements FourWheel { public void drive() { //Rule the rough terrain } } 

Maintenant, dans votre code, vous avez une classe appelée RoadTrip comme suit

 public class RoadTrip { private FourWheel myCarForTrip; } 

Maintenant, chaque fois que vous voulez une instance de Trip; Parfois, vous souhaiterez peut-être qu’un SUV initialise FourWheel ou que vous souhaitiez parfois une Sedan. Cela dépend vraiment de ce que vous voulez en fonction de la situation spécifique.

Pour résoudre ce problème, vous devez avoir un motif de fabrique en tant que motif de création. Où une usine renvoie la bonne instance. Vous finirez donc par avoir beaucoup de code de colle juste pour instancier correctement les objects. Le spring fait le travail du code de la colle le mieux sans ce code de colle. Vous déclarez des mappages en XML et initialisez les objects automatiquement. Il fait aussi beaucoup en utilisant l’architecture singleton pour les instances et cela aide à optimiser l’utilisation de la mémoire.

Ceci est également appelé Inversion de contrôle. Les autres frameworks pour ce faire sont Google Guice, Pico Container, etc.

En dehors de cela, Spring a un cadre de validation, une prise en charge étendue de la couche DAO en collaboration avec JDBC, iBatis et Hibernate (et bien d’autres). Fournit un excellent contrôle transactionnel sur les transactions de firebase database.

Il y a beaucoup plus au spring qui peut être lu dans de bons livres comme “Pro Spring”.

Les URL suivantes peuvent également être utiles.
http://static.springframework.org/docs/Spring-MVC-step-by-step/
http://en.wikipedia.org/wiki/Spring_Framework
http://www.theserverside.com/tt/articles/article.tss?l=SpringFramework

Le bon vieux temps, le spring était un cadre d’dependency injection uniquement comme ( Guice , PicoContainer , …), mais maintenant, c’est une solution totale pour construire votre application d’entreprise .

L’dependency injection au spring, qui est bien sûr le coeur du spring, est toujours là (et vous pouvez revoir d’autres bonnes réponses ici), mais il y en a plus du spring ….

Spring a maintenant beaucoup de projets, chacun avec quelques sous projets ( http://spring.io/projects ). Quand on parle de spring, il faut savoir quel projet de spring il parle, est-ce seulement le kernel de spring, connu sous le nom de cadre de spring , ou bien d’autres projets de spring.

Quelques projets printaniers qui méritent également d’être mentionnés sont:

Si vous avez besoin de certaines fonctionnalités supplémentaires pour votre application, vous pouvez le trouver aussi:

  • cadre de lot par lots de spring conçu pour permettre le développement de
    application par lots
  • spring HATEOAS création facile de la base api REST sur le principal HATEOAS
  • spring mobile et spring andriod pour le développement d’applications mobiles
  • Spring Shell crée une application complète (shell en ligne de commande)
  • stream de données de nuages ​​de spring et de nuages ​​de spring pour les applications cloud

Il y a aussi quelques petits projets là-bas par exemple Spring-Social-facebook ( http://projects.spring.io/spring-social-facebook/ )

Vous pouvez utiliser Spring pour le développement Web, car le module Spring MVC fait partie du projet Spring Framework . Ou vous pouvez utiliser Spring avec un autre travail de cadre Web, comme les struts2 .

À quoi sert le spring? Je vais répondre à cette question sous peu, mais d’abord, prenons un autre exemple de Victor Hugo. Ce n’est pas un bon exemple car cela ne justifie pas la nécessité d’un nouveau cadre.

 public class BaseView { protected UserLister userLister; public BaseView() { userLister = new UserListerDB(); // only line of code that needs changing } } public class SomeView extends BaseView { public SomeView() { super(); } public void render() { List users = userLister.getUsers(); view.render(users); } } 

Terminé! Donc, même si vous avez des centaines ou des milliers de vues, il vous suffit de changer la seule ligne de code, comme dans l’approche Spring XML. Mais pour modifier une ligne de code, il est toujours nécessaire de recomstackr le fichier plutôt que d’éditer le XML que vous dites? Eh bien mon ami difficile, utilisez Ant et script loin!

Alors, à quoi sert le spring? C’est pour:

  1. Les développeurs aveugles qui suivent le troupeau
  2. Les employeurs qui ne veulent jamais embaucher de programmeurs diplômés parce qu’ils n’enseignent pas de tels frameworks chez Uni
  3. Les projets qui ont démarré avec une mauvaise conception et qui nécessitent un patchwork (comme le montre l’exemple de Victor Hugo)

Lectures complémentaires: http://discuss.joelonsoftware.com/?joel.3.219431.12

Très bref résumé, je dirai que le spring est la “colle” dans votre application. Il est utilisé pour intégrer différents frameworks et votre propre code.

Le spring est trois choses.

  1. Spring gère l’dependency injection et je vous recommande de lire l’excellente introduction de Martin Fowler sur l’dependency injection.
  2. La deuxième chose que Spring fait est d’emballer d’excellentes bibliothèques Java d’une manière très élégante dans vos applications. Pour un bon exemple, voyez comment Spring encapsule les exécuteurs de tâches et le planificateur de quartz.
  3. Troisièmement, Spring fournit un ensemble d’implémentations de trucs Web tels que REST, un framework Web MVC, etc. Ils pensent que depuis que vous utilisez Spring pour les deux premiers, vous pouvez peut-être simplement l’utiliser pour tout ce dont votre application Web a besoin.

Le problème est que Spring DI est vraiment bien pensé, les enveloppes autour d’autres choses sont vraiment bien pensées en ce sens que les autres choses ont tout pensé et que Spring est tout simplement parfait. Les implémentations Spring de MVC et REST et toutes les autres choses ne sont pas aussi bien faites (YMMV, IMHO) mais il y a des exceptions (la sécurité Spring est une bombe). Donc, j’ai tendance à utiliser Spring pour DI, et ses emballages sympas, mais je préfère d’autres choses pour le Web (j’aime beaucoup Tapestry), REST (Jersey est vraiment robuste), etc.

Ce que vous voudriez probablement dans une application Web avec Spring –

  • Spring MVC, qui avec 2.5+ vous permet d’utiliser les POJO en tant que classes de Contrôleurs, ce qui signifie que vous n’avez pas besoin de passer d’une structure particulière (comme dans Struts ou Spring pre-2.5). Les classes de contrôleur sont également faciles à tester grâce en partie à l’dependency injection
  • Intégration de spring avec Hibernate, qui simplifie grandement le travail avec cette solution ORM (pour la plupart des cas)
  • Utiliser Spring pour une application Web vous permet d’utiliser vos objects de domaine à tous les niveaux de l’application – les mêmes classes qui sont mappées à l’aide d’Hibernate sont les classes que vous utilisez comme «beans de formulaire». Par nature, cela conduira à un modèle de domaine plus robuste, en partie parce que cela réduira le nombre de classes.
  • Les balises de forme de spring facilitent la création de formulaires sans trop de problèmes.

En outre, Spring est énorme – il y a donc beaucoup d’autres choses qui pourraient vous intéresser dans une application Web telle que Spring AOP ou Spring Security. Mais les quatre éléments énumérés ci-dessus décrivent les composants communs de Spring utilisés dans une application Web.

Je vois deux parties à ceci:

  1. “Qu’est-ce que le spring pour” -> voir la réponse acceptée par Victor Hugo.
  2. “[…] Spring est [un] bon cadre pour le développement web” -> les gens disent que cela parle de Spring MVC. Spring MVC est l’une des nombreuses parties de Spring, et constitue un framework Web utilisant les fonctionnalités générales de Spring, comme l’dependency injections. C’est un framework assez générique en ce sens qu’il est très configurable: vous pouvez utiliser différentes couches de db (Hibernate, iBatis, plain JDBC), différentes couches d’affichage (JSP, Velocity, Freemarker …)

Notez que vous pouvez parfaitement utiliser Spring dans une application Web sans utiliser Spring MVC. Je dirais que la plupart des applications Web Java font cela, tout en utilisant d’autres frameworks Web tels que Wicket, Struts, Seam, …

Le spring est idéal pour coller des instances de classes ensemble. Vous savez que vos classes Hibernate auront toujours besoin d’une source de données, Spring les connecte ensemble (et dispose également d’une implémentation de la source de données).

Vos objects d’access aux données auront toujours besoin d’un access Hibernate, Spring connecte les classes Hibernate dans vos DAO pour vous.

De plus, Spring vous offre des configurations solides de bibliothèques et vous donne des indications sur les bibliothèques à utiliser.

Le spring est vraiment un excellent outil. (Je ne parlais pas de Spring MVC, juste du framework de base).

La réponse acceptée n’implique pas l’utilisation des annotations depuis que Spring a pris en charge plusieurs annotations pour la configuration.

Approche de spring (dependency injection)

Il existe un autre moyen de relier les classes avec un fichier XML: les annotations. Utilisons l’exemple de la réponse acceptée et enregistrons le bean directement sur la classe en utilisant l’une des annotations @Component , @Service , @Repository ou @Configuration :

 @Component public class UserListerDB implements UserLister { public List getUsers() { // DB access code here } } 

De cette façon, lorsque la vue est créée, elle aura comme par magie un UserLister prêt à fonctionner.

La déclaration ci-dessus est valable avec un petit bonus sans besoin de toute utilisation de fichier XML et de câblage avec une autre annotation @Autowired qui trouve une implémentation pertinente et l’injecte.

 @Autowired private UserLister userLister; 

Utilisez l’annotation @Bean sur une méthode permettant d’injecter l’implémentation du bean.

L’avantage est l’ dependency injection (DI) . Cela signifie externaliser la tâche de création d’object. Permettez-moi d’expliquer avec un exemple.

 public interface Lunch { public void eat(); } public class Buffet implements Lunch { public void eat() { // Eat as much as you can } } public class Plated implements Lunch { public void eat() { // Eat a limited portion } } 

Maintenant, dans mon code, j’ai une classe LunchDecide comme suit:

 public class LunchDecide { private Lunch todaysLunch; public LunchDecide(){ this.todaysLunch = new Buffet(); // choose Buffet -> eat as much as you want //this.todaysLunch = new Plated(); // choose Plated -> eat a limited portion } } 

Dans la classe ci-dessus, en fonction de notre humeur, nous choisissons Buffet () ou Plated (). Cependant, ce système est étroitement couplé. Chaque fois que nous avons besoin d’un type d’object différent, nous devons changer le code. Dans ce cas, commenter une ligne! Imaginez qu’il y ait 50 classes différentes utilisées par 50 personnes différentes. Ce serait un sacré bordel. Dans ce cas, nous devons découpler le système. Réécrivons la classe LunchDecide.

 public class LunchDecide { private Lunch todaysLunch; public LunchDecide(Lunch todaysLunch){ this.todaysLunch = todaysLunch } } 

Notez qu’au lieu de créer un object en utilisant le nouveau mot-clé, nous avons passé la référence à un object de type Lunch comme paramètre à notre constructeur. Ici, la création d’object est externalisée. Ce code peut être câblé en utilisant un fichier de configuration Xml (hérité) ou des annotations Java (modernes). Dans tous les cas, la décision sur le type d’object qui serait créé serait effectuée lors de l’exécution. Un object serait injecté par Xml dans notre code – Notre code dépend de XML pour ce travail. D’où, dependency injection (DI). DI permet non seulement de coupler notre système de manière souple, mais simplifie également la rédaction des tests unitaires car il permet de simuler les dépendances. Last but not least, DI rationalise la programmation orientée aspect (AOP), ce qui conduit à un découplage supplémentaire et à une augmentation de la modularité. Notez également que ci-dessus DI est Constructor Injection. Le DI peut également être réalisé par injection Setter – même méthode de réglage simple de l’encapsulation.

Spring est une bonne alternative à la technologie Enterprise JavaBeans (EJB) . Il a également un composant Web Framework et Web Services Framework.

Le spring a commencé comme un système d’dependency injection assez simple. Maintenant, il est immense et contient tout (sauf l’évier de cuisine).

Mais n’ayez crainte, il est assez modulaire, vous pouvez donc utiliser uniquement les pièces que vous voulez.

Pour voir où tout a commencé, essayez:

http://www.amazon.com/Expert-One-Design-Development-Programmer/dp/0764543857/ref=sr_1_1?ie=UTF8&s=books&qid=1246374863&sr=1-1

C’est peut-être vieux mais c’est un excellent livre.

Pour un autre bon livre cette fois-ci exclusivement consacré à Spring, voir:

http://www.amazon.com/Professional-Java-Development-Spring-Framework/dp/0764574833/ref=sr_1_2?ie=UTF8&s=books&qid=1246374863&sr=1-2

Il fait également référence à d’anciennes versions de Spring, mais vaut vraiment la peine d’être examiné.

Spring était une dependency injection au début, puis ajoutait un roi de wrappers pour presque tout (wrapper sur les implémentations JPA, etc.).

Histoire longue … la plupart des solutions XML preffer XML (moteur de script XML … brrrr), donc pour DI j’utilise Guice

Bonne bibliothèque, mais avec depnedenciec croissante, par exemple Spring JDBC (peut-être une solution jdbc Java avec des parameters de noms réels) tirée de maven 4-5 next.

En utilisant Spring MVC (partie de “big spring”) pour le développement web … c’est un framework “basé sur la requête”, il y a la guerre sainte “demande vs composant” … à vous de jouer

  • Spring est un framework léger et flexible comparé à J2EE.
  • Le conteneur à ressort agit comme une inversion du contrôle.
  • Spring utilise AOP, c’est-à-dire les proxies et les modèles Singleton, Factory et Template Method Design.
  • Architectures hiérarchisées: Séparation des préoccupations et des couches réutilisables et maintenance facile.

entrer la description de l'image ici

Dans le passé, je pensais au framework Spring du sharepoint vue purement technique.

Compte tenu de l’expérience acquise en matière de travail en équipe et de développement de Webapps d’entreprise, je dirais que le spring permet un développement plus rapide des applications (applications Web) en découplant ses éléments individuels (beans). Un développement plus rapide le rend si populaire. Spring permet de transférer la responsabilité de la construction (câblage) de l’application sur le framework Spring. L’ dependency injection du framework Spring est responsable de la connexion / du câblage des beans individuels dans une application fonctionnelle.

De cette façon, les développeurs peuvent se concentrer davantage sur le développement de composants individuels (beans) dès que les interfaces entre les beans sont définies.

Tester une telle application est facile – l’accent est principalement mis sur les haricots individuels. Ils peuvent être facilement découplés et simulés, de sorte que les tests unitaires sont rapides et efficaces.

La structure Spring définit plusieurs beans spécialisés tels que @Controller ( @Restcontroller ), @Repository , @Component pour répondre aux besoins du Web. Spring et Maven offrent une structure intuitive pour les développeurs. Le travail en équipe est simple et rapide, car les éléments individuels sont séparés et peuvent être réutilisés.

Le framework Spring est d’une qualité irréprochable pour le développement web plus spécifique pour l’API Rest. C’est à cause de l’ dependency injections et de l’intégration avec d’autres modules comme la sécurité des ressorts , Spring AOP , Mvc Framework , les microservices.

Toute application que vous construisez définitivement a besoin de sécurité.
Si vous construisez un produit, un long entretien, vous aurez besoin du concept Aop.

Si votre application a beaucoup plus de charge, vous devez implémenter des microservices.

Le spring donne tout cela en une seule plate-forme. Support avec plusieurs modules
Le principal est que le spring est open source et le framework extensible, avoir un crochet partout pour intégrer le code personnalisé dans le cycle de vie.

Spring Data est un projet qui intègre votre projet.

Donc, tout ce dont vous avez besoin pour créer une application a le spring.