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?
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.
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!
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?
UserLister
? Il suffit de changer le XMLUserLister
prête? Programmer une implémentation temporelle de UserLister
et faciliter le développement de la vueIl 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.
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
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:
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.
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:
Lectures supplémentaires: http://discuss.joelonsoftware.com/?joel.3.219431.12
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.
Le printemps est trois choses.
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.
Ce que vous voudriez probablement dans une application Web avec Spring -
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.
Je vois deux parties à ceci:
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, ...
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).
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.
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.
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.
Spring est une bonne alternative à Enterprise JavaBeans (EJB) technology. Il comporte également un cadre Web et un composant de cadre de services Web.
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
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:
C'est peut-être vieux mais c'est un excellent livre.
Pour un autre bon livre consacré exclusivement au printemps, voir:
Il fait également référence à des versions plus anciennes de Spring mais mérite certainement d’être examiné.
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é.
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.