web-dev-qa-db-fra.com

A quoi sert Spring Framework exactement?

J'entends beaucoup parler de Spring , les gens disent partout sur le Web que Spring est un bon cadre de développement Web. A quoi sert Spring Framework exactement?

566
Maksim

A la base, Spring est un framework pour dependency-injection qui est un modèle qui permet de construire des systèmes très découplés.

Le problème

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

public interface UserLister {
    List<User> getUsers();
}

Et peut-être une implémentation accédant à une base de données pour obtenir tous les utilisateurs:

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

Dans votre vue, vous aurez besoin d'accéder à une instance (juste un exemple, rappelez-vous):

public class SomeView {
    private UserLister userLister;

    public void render() {
        List<User> 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'instancie explicitement l'objet comme ceci:

UserLister userLister = new UserListerDB();

... Je couplerais la vue avec mon implémentation de la classe qui accède à la base de données. Que se passe-t-il si je souhaite passer d'une implémentation de base de données à une autre qui récupère la liste d'utilisateurs à partir d'un fichier séparé par des virgules (rappelez-vous que c'est un exemple)? Dans ce cas, je retournerais à mon code et changerais la dernière ligne en:

UserLister userLister = new UserListerCommaSeparatedFile();

Ce n’est pas un problème avec un petit programme comme celui-ci mais ... Que se passe-t-il dans un programme comportant des centaines de vues et un nombre similaire de classes d’affaires? La maintenance devient un cauchemar!

Approche Printemps (injection de dépendance)

Ce que fait Spring, c’est câbler les classes en utilisant un fichier XML ou des annotations. Ainsi, tous les objets sont instanciés et initialisés par Spring et injecté aux bons endroits (Servlets, Web Frameworks, Business classes , DAO, etc, etc, etc ...).

Pour revenir à l'exemple de Spring, nous avons juste besoin d'un sélecteur pour le champ userLister et d'un fichier XML comme celui-ci:

<bean id="userLister" class="UserListerDB" />

<bean class="SomeView">
    <property name="userLister" ref="userLister" />
</bean>

ou plus simplement, annotez le fichier dans notre classe d'affichage avec @Inject:

@Inject
private UserLister userLister;

Ainsi, lorsque la vue est créée, comme par magie aura un UserLister prêt à fonctionner. 

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

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

  • Et si vous voulez utiliser une autre implémentation de votre interface UserLister? Il suffit de changer le XML
  • Et si vous n'avez pas d'implémentation UserLister 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'utilisez pas! Votre application ne lui est pas couplée. Inversion of Control déclare: "L'application contrôle le framework, pas le framework contrôle l'application".

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

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

655
victor hugo

Spring contient (comme Skaffman l'a fait remarquer à juste titre) un framework MVC. En résumé, voici mes entrées . Spring prend en charge la ségrégation de la couche de service, de la couche Web et de la couche métier, mais ce qu’elle fait le mieux, c’est bien l’injection d’objets. Donc, pour expliquer cela avec un exemple, considérons 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 voudrez peut-être qu'un VUS initialise FourWheel ou parfois, vous voudrez Sedan. Cela dépend vraiment de ce que vous voulez en fonction de la situation. 

Pour résoudre ce problème, vous souhaitez utiliser un modèle d'usine comme modèle de création. Où une usine retourne la bonne instance. Donc, vous finirez par vous retrouver avec beaucoup de code collé pour instancier correctement les objets. Spring fait le travail de code de colle mieux sans ce code de colle. Vous déclarez des mappages en XML et les objets sont initialisés automatiquement. Il utilise également beaucoup l'architecture singleton pour les instances, ce qui contribue à optimiser l'utilisation de la mémoire.

Ceci est également appelé Inversion Of Control. D'autres guichets à cet effet sont Google guice, Pico Container, etc. 

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

Il y a beaucoup plus à Spring qui peuvent être lus 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

57
Priyank

Auparavant, Spring était un bâti d’injection de dépendance ressemblant à (Guice, PicoContainer, ...), mais il s’agit maintenant d’une solution totale pour vous construire Application d'entreprise.

L'injection de dépendance de printemps, qui est bien sûr le cœur du printemps, est toujours là (et vous pouvez consulter d'autres bonnes réponses ici), mais il y en a d'autres du printemps ....

Spring a maintenant beaucoup de projets, chacun avec quelques sous-projets ( http://spring.io/projects ). Quand quelqu'un parle de printemps, vous devez savoir de quel projet de printemps il parle, s’agit-il seulement du ressort, appelé spring framework, ou encore d’un autre projet de printemps.

Quelques projets de printemps qui méritent d’être mentionnés sont:

Si vous avez besoin de fonctionnalités plus spécifiques pour votre application, vous les trouverez également ici:

  • Spring Batch batch framework conçu pour permettre le développement de
    application par lots
  • Spring HATEOAS création facile de la base d’API REST sur HATEOAS principal
  • Spring Mobile et Spring Andriod pour le développement d'applications mobiles
  • Spring Shell construire une application complète (en ligne de commande) 
  • Spring Cloud et Spring Cloud Data Flow pour les applications cloud

Il y a également quelques projets minuscules, par exemple spring-social-facebook ( http://projects.spring.io/spring-social-facebook/ )

Vous pouvez utiliser spring pour le développement Web car il contient le module Spring MVC qui fait partie du projet Spring Framework. Ou vous pouvez utiliser spring avec un autre travail de cadre Web, tel que struts2.

35
Alireza Fattahi

A quoi sert le printemps? Je vais répondre à cette question dans un instant, mais examinons d’abord l’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<User> users = userLister.getUsers();
    view.render(users);
  }
}

Terminé! Alors maintenant, même si vous avez des centaines ou des milliers de vues, il vous reste à changer la ligne de code, comme dans l'approche XML Spring . Mais modifier une ligne de code nécessite tout de même une recompilation par opposition à l'édition de XML. ? Bien mon ami tatillon, utilisez Ant et le script!

Alors, à quoi sert le printemps? C'est pour:

  1. Développeurs aveugles qui suivent le troupeau
  2. Les employeurs qui ne veulent jamais engager de programmeurs diplômés parce qu’ils n’enseignent pas de tels cadres à Uni
  3. Les projets qui ont commencé avec un mauvais design et qui nécessitent un patchwork (comme le montre l'exemple de Victor Hugo)

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

25
Ash

En résumé, je dirai que le printemps est la "colle" de votre application. Il est utilisé pour intégrer différents frameworks et votre propre code.

18
Johan

Le printemps est trois choses.

  1. Spring gère l'injection de dépendance et je vous recommande de lire l'excellente introduction de Martin Fowler sur l'injection de dépendance.
  2. La deuxième chose que Spring fait est d’envelopper d’excellentes bibliothèques Java de 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. Thirdly Spring propose une multitude d'implémentations de contenus Web tels que REST, un framework Web MVC, etc. Étant donné que vous utilisez Spring pour les deux premiers jours, ils figurent, vous pouvez peut-être simplement l'utiliser pour tout ce dont votre application web a besoin. 

Le problème, c’est que Spring DI est vraiment bien pensé, les emballages autour d’autres choses sont vraiment bien pensés, dans la mesure où les autres choses ont tout pensé et que Spring les enveloppe joliment. Les implémentations Spring de MVC et REST et de tous les autres éléments ne sont pas aussi bien conçus (YMMV, IMHO), mais il existe des exceptions (Spring Security is da bomb). J'ai donc tendance à utiliser Spring pour DI, et ses emballages sympas, mais préfère d'autres éléments pour Web (j'aime beaucoup Tapestry), REST (le maillot est vraiment robuste), etc.

13
karstensrage

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

  • Spring MVC, qui avec la version 2.5+ vous permet d’utiliser des POJO en tant que classes de contrôleurs, ce qui vous évite de devoir sortir d’un framework particulier (comme dans Struts ou Spring pré-2.5). Les classes de contrôleurs sont également simples à tester, en partie grâce à l’injection de dépendance
  • Intégration printanière avec Hibernate, qui simplifie grandement le travail avec cette solution ORM (dans la plupart des cas)
  • L'utilisation de Spring pour une application Web vous permet d'utiliser vos objets de domaine à tous les niveaux de l'application. Les mêmes classes mappées à l'aide d'Hibernate sont les classes que vous utilisez en tant que "beans form". Par nature, cela conduira à un modèle de domaine plus robuste, en partie parce qu'il va réduire le nombre de classes.
  • Les balises de formulaire Spring facilitent la création de formulaires sans tracas. 

De plus, Spring est ÉNORME. Il y a donc beaucoup d'autres choses qui pourraient vous intéresser dans une application Web, telles 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. 

11
bpapa

Je vois deux parties à ceci:

  1. "A quoi sert exactement le printemps" -> Voir la réponse acceptée de 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’un des nombreux composants de Spring. Il s’agit d’un framework Web exploitant les fonctionnalités générales de Spring, telles que l’injection de dépendances. C'est un framework assez générique en ce sens qu'il est très configurable: vous pouvez utiliser différentes couches de base de données (Hibernate, iBatis, JDBC simple), différentes couches de vue (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 le font, tout en utilisant d'autres frameworks Web tels que Wicket, Struts, Seam, ...

8
Tom De Leu

Le printemps 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 relie ensemble (et dispose également d'une implémentation de la source de données). 

Vos objets d'accès aux données auront toujours besoin d'un accès Hibernate. Spring connecte les classes Hibernate à vos DAO pour vous.

De plus, Spring vous fournit essentiellement des configurations solides d’un ensemble de bibliothèques et vous aide à choisir les bibliothèques à utiliser. 

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

7
stevedbrown

La réponse acceptée ne concerne pas l'utilisation des annotations puisque Spring a introduit la prise en charge de diverses annotations pour la configuration.

Approche Printemps (injection de dépendance)

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<User> getUsers() {
        // DB access code here
    }
}

Ainsi, lors de la création de la vue, un UserLister sera prêt comme par magie.

L'instruction ci-dessus est valide avec un petit bonus qui évite l'utilisation d'un fichier XML et le 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 utilisée pour injecter l'implémentation de bean.

5
Nikolas

L'avantage est Injection de dépendance (DI) . Cela signifie externaliser la tâche de création d'objet. Laissez-moi vous 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 Plaqué (). Cependant, ce système est étroitement couplé. Chaque fois que nous avons besoin d'un type d'objet différent, nous devons modifier le code. Dans ce cas, commentant une ligne! Imaginez 50 classes différentes utilisées par 50 personnes différentes. Ce serait un sacré bordel. Dans ce cas, nous devons dissocier 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 objet à l'aide d'un nouveau mot clé, nous avons passé la référence à un objet de Lunch Type en tant que paramètre de notre constructeur. Ici, la création d'objet est externalisée. Ce code peut être câblé en utilisant un fichier de configuration Xml (hérité) ou Java Annotations (moderne). Dans les deux cas, la décision sur le type d'objet créé sera prise lors de l'exécution. Un objet serait injecté par XML dans notre code - notre code dépend de XML pour ce travail. Par conséquent, injection de dépendance (DI). DI aide non seulement à rendre notre système faiblement couplé, il simplifie également l’écriture des tests unitaires car il permet de simuler des dépendances. Dernier point mais non le moindre, DI simplifie la programmation orientée aspect (AOP), ce qui entraîne un découplage supplémentaire et une augmentation de la modularité. Notez également que ci-dessus DI est Constructor Injection. La DI peut également être effectuée par Setter Injection - la même ancienne méthode de définition d’encapsulation. 

4
Sumit Pokhrel

Spring est une bonne alternative à Enterprise JavaBeans (EJB) technology. Il comporte également un cadre Web et un composant de cadre de services Web.

3
fastcodejava
  • 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 mandataires et les modèles Singleton, Factory et Template Method Design.
  • Architectures à plusieurs niveaux: séparation des problèmes et des couches réutilisables et maintenance aisée.

 enter image description here

2
Premraj

Spring était une injection de dépendance au début, puis ajoutez le roi des wrappers pour presque tout (wrapper sur les implémentations JPA, etc.).

Longue histoire ... la plupart des solutions XML Spring (moteur de script XML ... brrrr), donc pour DI j'utilise Guice

Bonne bibliothèque, mais avec un nombre croissant de depnedenciec, par exemple Spring JDBC (peut-être une solution Java jdbc avec des paramètres de noms réels) extraite de maven 4-5.

Utilisation de Spring MVC (composant de "Big Spring") pour le développement Web ... il s’agit d’un "système basé sur les demandes", il existe une "guerre sainte" composant "vs composant" ... à vous de voir

1
Jacek Cz

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

Mais ne craignez rien, il est assez modulaire et vous pouvez utiliser uniquement les éléments de votre choix.

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 consacré exclusivement au printemps, 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 à des versions plus anciennes de Spring mais mérite certainement d’être examiné.

1
Pablojim

Dans le passé, je pensais au framework Spring sous un angle purement technique. 

Avec une certaine expérience du travail en équipe et du développement d'applications Web d'entreprise - je dirais que Spring est destiné à développement plus rapide d'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'injection de dépendance dependency du framework Spring est responsable de la connexion/du câblage de beans individuels dans une application opérationnelle.

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

Le test de cette application est facile - l’accent est mis sur les haricots individuels. Ils peuvent être facilement découplés et simulés, ainsi les tests unitaires sont rapides et efficaces.

Le framework Spring définit plusieurs beans spécialisés, tels que @Controller (@Restcontroller), @Repository, @Component pour servir des objectifs Web. Spring, associé à Maven, fournit une structure intuitive aux développeurs . Le travail en équipe est simple et rapide, car chaque élément est séparé et peut être réutilisé.

0
Witold Kaczurba

Le framework Spring est certainement bon pour le développement Web, plus spécifique à Rest api . Il est dû à son injection de dependency et à son intégration à d’autres modules tels que spring security , spring aop , mvc framework , microservices

Toute application que vous construisez définitivement a besoin de sécurité .
Si vous construisez un produit nécessitant une maintenance longue, vous aurez certainement besoin du concept Aop.

Si votre application est beaucoup plus chargée, vous devez implémenter des microservices .

Le printemps donne tout cela en une seule plateforme. Support avec de nombreux modules
La principale chose à faire est que le printemps soit open source et un cadre extensible, qu’il y ait un point d’accès pour intégrer le code personnalisé au cycle de vie .

Spring Data est un projet intégrant votre projet. 


Donc, tout ce dont vous avez besoin pour construire une application a Spring. 

0
pratik deshai