Couche Spring .net

7
Lecture du tutoriel Infos sur le chapitre Auteur: ders21 Publié: 12/07/2013 Mise à jour: 12/07/2013 Ctg: Programmation Licence Open Source Maitrisez c# sous le Framework .Net La couche Spring Sans plus tarder nous revenons au code du fichier [Dialogue.cs] qui crée les couches [dao] et [metier] dans le chapitre précédent: La ligne 5 crée les couches [dao] et [metier] en nommant explicitement les classes d’implémentation des deux couches : FileImpot pour la couche [dao], ImpotMetier pour la couche [metier] . Si l’implémentation d’une des couches est faite avec une nouvelle classe, la ligne 5 sera changée. Par exemple : En-dehors de ce changement, rien ne changera dans l’application du fait que chaque couche communique avec la suivante selon une interface. Tant que cette dernière ne change pas, la communication entre couches ne change pas non plus . Que vient faire maintenant le framework Spring dans cette belle rélation amoureuse religieuse ??? Spring va nous permettre d’aller un peu plus loin dans l’indépendance des couches en nous aidant d’externaliser dans un fichier de configuration le nom des classes implémentant les différentes couches. C’est qui aura pour consequence quand on modifiera l’implémentation d’une couche on aurra juste à changer un fichier de configuration. Il n’y a aucun impact sur le code de l’application . Deux secondes,... voilà nous sommes ici : Ci-dessus, la couche [ui] va demander [0] à Spring d’instancier les couches [dao] [1] et [metier] [2] d’après les informations contenues dans un fichier de configuration. La couche [ui] demandera ensuite à Spring [3], une référence sur la couche [metier] : • ligne 5 : instanciation des couches [dao] et [metier] par Spring • ligne 7 : on récupère une référence sur la couche [metier]. On notera que la couche [ui] a eu cette référence sans donner le nom de la classe implémentant la couche [metier]. Installation Le framework Spring existe en deux versions : Java et .NET. La version .NET est disponible à l’url [ http://www.springframework.net/] : 1 2 3 4 5 6 7 8 9 10 11 // on crée les couches [metier et dao] IImpotMetier metier = null; try { // création couche [metier] metier = new ImpotMetier(new FileImpot("DataImpot.txt")); } catch (ImpotException e) { // affichage erreur ... // arrêt programme Environment.Exit(1); } 1 metier = new ImpotMetier(new HardwiredImpot()); 1 2 3 4 5 6 7 8 9 10 // on crée les couches [metier et dao] IImpotMetier metier = null; try { // contexte Spring IApplicationContext ctx = ContextRegistry.GetContext(); // on demande une référence sur la couche [metier] metier = (IImpotMetier)ctx.GetObject("metier"); } catch (Exception e1) { ... } ? ? ? FR EN CD Recherche Mot de passe : Mot de passe oublié ? Connexion auto. Connexion - Accueil Cours/Tutoriel Blog Forum SdG Communauté Site du Gaci - La couche Spring http://sitedugaci.com/33/3/tutoriel/chapitre/la-couche-spring.html 1 sur 7 3/30/2016 8:23 AM

description

Module framework .net C#

Transcript of Couche Spring .net

Lecture du tutoriel

Infos sur le chapitreAuteur: ders21Publié:12/07/2013Mise à jour:12/07/2013

Ctg: ProgrammationLicenceOpen Source

Maitrisez c# sous le Framework .Net

La couche Spring

Sans plus tarder nous revenons au code du fichier [Dialogue.cs] qui crée les couches [dao] et [metier] dansle chapitre précédent:

La ligne 5 crée les couches [dao] et [metier] en nommant explicitement les classes d’implémentation desdeux couches : FileImpot pour la couche [dao], ImpotMetier pour la couche [metier] . Si l’implémentationd’une des couches est faite avec une nouvelle classe, la ligne 5 sera changée. Par exemple :

En-dehors de ce changement, rien ne changera dans l’application du fait que chaque couche communiqueavec la suivante selon une interface. Tant que cette dernière ne change pas, la communication entre couchesne change pas non plus .Que vient faire maintenant le framework Spring dans cette belle rélation amoureuse religieuse ???

Spring va nous permettre d’aller un peu plus loin dans l’indépendance des couches en nous aidantd’externaliser dans un fichier de configuration le nom des classes implémentant les différentes couches.C’est qui aura pour consequence quand on modifiera l’implémentation d’une couche on aurra juste àchanger un fichier de configuration. Il n’y a aucun impact sur le code de l’application .Deux secondes,... voilà nous sommes ici :

Ci-dessus, la couche [ui] va demander [0] à Spring d’instancier les couches [dao] [1] et [metier] [2] d’aprèsles informations contenues dans un fichier de configuration. La couche [ui] demandera ensuite à Spring [3],une référence sur la couche [metier] :

• ligne 5 : instanciation des couches [dao] et [metier] par Spring• ligne 7 : on récupère une référence sur la couche [metier]. On notera que la couche [ui] a eu cette référencesans donner le nom de la classe implémentant la couche [metier].

InstallationLe framework Spring existe en deux versions : Java et .NET. La version .NET est disponible à l’url[http://www.springframework.net/] :

1234567891011

// on crée les couches [metier et dao]IImpotMetier metier = null;try { // création couche [metier]metier = new ImpotMetier(new FileImpot("DataImpot.txt"));} catch (ImpotException e) {// affichage erreur...// arrêt programmeEnvironment.Exit(1);}

1 metier = new ImpotMetier(new HardwiredImpot());

12345678910

// on crée les couches [metier et dao]IImpotMetier metier = null;try {// contexte SpringIApplicationContext ctx = ContextRegistry.GetContext();// on demande une référence sur la couche [metier]metier = (IImpotMetier)ctx.GetObject("metier");} catch (Exception e1) {...}

?

?

?

FR EN CDRecherche

Mot de passe :Mot de passe oublié ?

Connexion auto.

Connexion-Accueil Cours/Tutoriel Blog Forum SdG Communauté

Site du Gaci - La couche Spring http://sitedugaci.com/33/3/tutoriel/chapitre/la-couche-spring.html

1 sur 7 3/30/2016 8:23 AM

• en [1] : le site de [Spring.net]• en [2] : la page des téléchargements, enregistrez-vous (gratuitement) puis télécharger le pâquet,...

• en [5] : le dossier généré par l’installation• en [6] : le dossier [bin/net/2.0/release (si vous avez la version1.1)] mais pour la version Spring 2.0.0 (laversion que j’utilise) c’est dans le dossier [bin/net/3.5/debug qui vous retrouverez les DLL de Spring pourles projets Visual Studio .NET 2.0 ou supérieur.

Pour la version Spring 2.0.0 le DLL antlr.runtime.dll est déjà inclu par défaut, alors inutiile de le chercherparce que vous le retrouverez pas

Spring est un framework riche. L’aspect de Spring que nous allons utiliser ici pour gérer l’intégration descouches dans une application s’appelle IoC : Inversion of Control ou encore DI : Dependence Injection .Spring apporte des bibliothèques pour l’accès aux bases de données avec NHibernate, la génération etl’exploitation de services web, d’applications web, ...• les DLL nécessaires pour gérer l’intégration des couches dans une application sont les DLL [7] et [8].Nous stockons ces trois DLL dans un dossier [lib] de notre projet :

• [1] : les trois DLL sont placées dans le dossier [lib] avec l’explorateur windowsEncore une fois, si vous avez la version 2.0.0 ou superieure du Spring, Utiliser simplement les fichiers

Common.Logging.dll et Spring.Core.dll car antlr.runtime.dll est déjà inclu par défaut dans le FrameworkSpring.Net

• [2] : dans le projet [ui], on fait afficher tous les fichiers• [3] : le dossier [ui/lib] est désormais visible. On l’inclut dans le projet• [4] : le dossier [ui/lib] fait partie du projetL’opération de création du dossier [lib] n’est nullement indispensable. Les références pouvaient être crééesdirectement sur des DLL du dossier [Spring.net]. Mais cependant, cette opération de création du dossier [lib]permet cependant de développer l’application sur un poste ne disposant pas de [Spring.net] la rendant ainsimoins dépendante de l’environnement de développement disponible .Nous ajoutons au projet [ui] des références sur des nouvelles DLL :

• [1] : on crée des références sur les DLL du dossier [lib] [2]• [3] : les DLL font partie des références du projetRevenons encore une fois sur la vue d’ensemble de l’architecture de l’application :

Site du Gaci - La couche Spring http://sitedugaci.com/33/3/tutoriel/chapitre/la-couche-spring.html

2 sur 7 3/30/2016 8:23 AM

Ci-dessus, la couche [ui] va demander [0] à Spring d’instancier les couches [dao] [1] et [metier] [2] d’aprèsles informations contenues dans un fichier de configuration. La couche [ui] demandera ensuite à Spring [3],une référence sur la couche [metier]. Cela se traduira dans la couche [ui] par le code suivant :

• ligne 5 : instanciation des couches [dao] et [metier] par Spring• ligne 7 : on récupère une référence sur la couche [metier].La ligne [5] ci-dessus exploite le fichier de configuration [App.config] du projet Visual Studio. Dans unprojet C#, ce fichier sert à configurer l’application. [App.config] n’est donc pas une notion Spring mais unenotion Visual Studio que Spring exploite. Spring sait exploiter d’autres fichiers de configuration que[App.config]. La solution présentée ici n’est donc pas la seule disponible.

ConfigurationCréons le fichier [App.config] avec l’assistant Visual Studio :

• en [1] : ajout d’un nouvel élément au projet• en [2] : sélectionner "Application Configuration File"• en [3] : [App.config] est le nom par défaut de ce fichier de configuration• en [4] : le fichier [App.config] a été ajouté au projet

Le contenu du fichier [App.config] est le suivant :

[App.config] est un fichier XML. La configuration du projet se fait entre les balises <configuration>. Laconfiguration nécessaire à Spring est la suivante :

• lignes 11-23 : la section délimitée par la balise <spring> est appelée le groupe de sections <spring>. Onpeut créer autant de groupes de sections que l’on veut dans [App.config].• un groupe de sections a des sections : c’est le cas ici : - lignes 12-14 : la section <spring/context> - lignes 15-22 : la section <spring/objects>• lignes 4-9 : la région <configSections> définit la liste des gestionnaires (handlers) des groupes de sectionsprésents dans [App.config].• lignes 5-8 : définit la liste des gestionnaires des sections du groupe <spring> (name="spring").• ligne 6 : le gestionnaire de la section <context> du groupe <spring> :

12345678910

// on crée les couches [metier et dao]IImpotMetier metier = null;try {// contexte SpringIApplicationContext ctx = ContextRegistry.GetContext();// on demande une référence sur la couche [metier]metier = (IImpotMetier)ctx.GetObject("metier");} catch (Exception e1) {...}

123<?xml version="1.0" encoding="utf-8" ?><configuration></configuration>

123456789101112131415161718192021222324

<?xml version="1.0" encoding="utf-8" ?><configuration><configSections><sectionGroup name="spring"><section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" /><section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /></sectionGroup></configSections><spring><context><resource uri="config://spring/objects" /></context><objects xmlns="http://www.springframework.net"><object name="dao" type="Dao.FileImpot, ImpotsV5-dao"><constructor-arg index="0" value="DataImpot.txt"/></object><object name="metier" type="Metier.ImpotMetier, ImpotsV5-metier"><constructor-arg index="0" ref="dao"/></object></objects></spring></configuration>

?

?

?

Site du Gaci - La couche Spring http://sitedugaci.com/33/3/tutoriel/chapitre/la-couche-spring.html

3 sur 7 3/30/2016 8:23 AM

- name : nom de la section gérée - type : nom de la classe gérant la section sous la forme NomClasse, NomDLL.• la section <context> du groupe <spring> est gérée par la classe [Spring.Context.Support.ContextHandler]qui sera trouvée dans la DLL [Spring.Core.dll]• ligne 7 : le gestionnaire de la section <objects> du groupe <spring>Les lignes 4-9 sont standard dans un fichier [App.config] avec Spring. On se contente de les recopier d’unprojet à l’autre .• lignes 12-14 : définit la section <spring/context>.• ligne 13 : la balise <resource> a pour but d’indiquer où se trouve le fichier définissant les classes queSpring doit instancier. Celles-ci peuvent être dans [App.config] comme ici mais elles peuvent être égalementdans un fichier de configuration autre. La localisation de ces classes est faite dans l’attribut uri de la balise<resource> : - <resource uri="config://spring/objects> indique que la liste des classes à instancier se trouve dansle fichier [App.config] (config:), dans la section //spring/objects, c.a.d. dans la balise <objects> de la balise<spring> il cache bien son jeu celui-là . - <resource uri="file://spring-config.xml"> indiquerait que la liste des classes à instancier se trouvedans le fichier [spring-config.xml]. Celui-ci devrait être placé dans les dossiers d’exécution (bin/Release oubin/Debug) du projet. Le plus simple est de le placer, comme il a été fait pour le fichier [DataImpot.txt], à laracine du projet avec la propriété [Copy to output directory=always] .Les lignes 12-14 sont standard dans un fichier [App.config] avec Spring. On se contente de les recopier d’unprojet à l’autre .• lignes 15-22 : définissent les classes à instancier. C’est dans cette partie que se fait la configurationspécifique d’une application. La balise <objects> délimite la section de définition des classes à instancier.• lignes 16-18 : définissent la classe à instancier pour la couche [dao]• ligne 16 : chaque objet instancié par Spring fait l’objet d’une balise <object>. Celle-ci a un attribut namequi est le nom de l’objet instancié. C’est via celui-ci que l’application demande à Spring une référence :"donne-moi une référence sur l’objet qui s’appelle dao". L’attribut type définit la classe à instancier sous laforme NomClasse, NomDLL. Ainsi la ligne 16 définit un objet appelé "dao", instance de la classe"Dao.FileImpot" qui se trouve dans la DLL "ImpotsV5-dao.dll". On notera qu’on donne le nom complet dela classe (espace de noms inclus) et que le suffixe .dll n’est pas précisé dans le nom de la DLL .Une classe peut être instanciée de deux façons avec Spring :1. via un constructeur particulier auquel on passe des paramètres : c’est ce qui est fait dans les lignes 16-18.2. via le constructeur par défaut sans paramètres. L’objet est alors initialisé via ses propriétés publiques : labalise <object> a alors des sous-balises <property> pour initialiser ces différentes propriétés. Nous n’avonspas d’exemple de ce cas ici.• ligne 16 : la classe instanciée est la classe FileImpot. Celle-ci a le constructeur suivant :

Les paramètres du constructeur sont définis à l’aide de balises <constructor-arg>.• ligne 17 : définit le 1er et seul paramètre du constructeur. L’attribut index est le n° du paramètre duconstructeur, l’attribut value sa valeur : <constructor-arg index="i" value="valuei"/>• lignes 19-21 : définissent la classe à instancier pour la couche [metier] : la classe [Metier.ImpotMetier] quise trouve dans la DLL [ImpotsV5-metier.dll].• ligne 19 : la classe instanciée est la classe ImpotMetier. Celle-ci a le constructeur suivant :

• ligne 20 : définit le 1er et seul paramètre du constructeur. Ci-dessus, le paramètre dao du constructeur estune référence d’objet. Dans ce cas, dans la balise <constructor-arg> on utilise l’attribut ref au lieu del’attribut value qui a été utilisé pour la couche [dao] : <constructor-arg index="i" ref="refi"/> . Dans leconstructeur ci-dessus, le paramètre dao représente une instance sur la couche [dao]. Cette instance a étédéfinie par les lignes 16-18 du fichier de configuration. Ainsi dans la ligne 20 :

ref="dao" représente l’objet Spring "dao" défini par les lignes 16-18 .

Pour résumer, le fichier [App.config] :• instancie la couche [dao] avec la classe FileImpot qui reçoit pour paramètre DataImpot.txt (ligne 16-18).L’objet résultant est appelé "dao"• instancie la couche [metier] avec la classe ImpotMetier qui reçoit pour paramètre l’objet "dao" précédent(lignes 19-21).Il ne nous reste plus qu’à utiliser ce fichier de configuration Spring dans la couche [ui]. Pour cela, nousdupliquons la classe [Dialogue.cs] en [Dialogue2.cs] et nous faisons de cette dernière la classe principale duprojet [ui] :

Implémentation

1 public FileImpot(string fileName);

1 public ImpotMetier(IImpotDao dao);

1 <constructor-arg index="0" ref="dao"/>

?

?

?

Site du Gaci - La couche Spring http://sitedugaci.com/33/3/tutoriel/chapitre/la-couche-spring.html

4 sur 7 3/30/2016 8:23 AM

• en [1] : copie de [Dialogue.cs]• en [2] : collage• en [3] : la copie de [Dialogue.cs]• en [4] : renommée [Dialogue2.cs]

• en [6] : on fait de [Dialogue2.cs] la classe principale du projet [ui].Le code suivant de [Dialogue.cs] :

devient le suivant dans [Dialogue2.cs] :

• ligne 2 : IApplicationContext donne accès à l’ensemble des objets instanciés par Spring. On appelle cetobjet, le contexte Spring de l’application ou plus simplement le contexte de l’application. Pour l’instant, cecontexte n’a pas été initialisé. C’est le try / catch qui suit qui le fait. • ligne 5 : la configuration de Spring dans [App.config] est lue et exploitée. Après cette opération, s’il n’y apas eu d’exception, tous les objets de la section <objects> ont été instanciés :• l’objet Spring "dao" est une instance sur la couche [dao]• l’objet Spring "metier" est une instance sur la couche [metier]• ligne 25: la classe [Dialogue2.cs] a besoin d’une référence sur la couche [metier]. Celle-ci est demandée aucontexte de l’application. L’objet IApplicationContext donne accès aux objets Spring via leur nom (attribut name de la balise <object> de la configuration Spring ). La référence rendue est une référence sur le typegénérique Object. On est amenés à transtyper la référence rendue dans le bon type, ici le type de l’interfacede la couche [metier] : IImpotMetier .Si tout s’est bien passé, après la ligne 25, [Dialogue2.cs] a une référence sur la couche [metier]. Le code deslignes 27et au-delà est celui de la classe [Dialogue.cs] déjà étudiée .• lignes 12-23 : gestion de l’exception qui survient lorsque l’exploitation du fichier de configuration deSpring ne peut être menée à son terme. Il peut y avoir diverses raisons à cela : syntaxe incorrecte du fichierde configuration lui-même ou bien impossibilité à instancier l’un des objets configurés. Dans notre exemple,ce dernier cas se produirait si le fichier DataImpot.txt de la ligne 17 de [App.config] n’était pas trouvé dansle dossier d’exécution du projet. L’exception qui remonte ligne 12 est une chaîne d’exceptions où chaqueexception a deux propriétés : - Message : le message d’erreur liée à l’exception - InnerException : l’exception précédente dans la chaîne des exceptionsLa boucle des lignes 16-20 fait afficher toutes les exceptions de la chaîne sous la forme : classe del’exception et message associé. Lorsqu’on exécute le projet [ui] avec un fichier de configuration valide, onobtient les résultats habituels :

123456789101112131415

// on crée les couches [metier et dao]IImpotMetier metier = null;try { // création couche [metier]metier = new ImpotMetier(new FileImpot("DataImpot.txt"));} catch (ImpotException e) {// affichage erreurstring msg = e.InnerException == null ? null : String.Format(", Exception d’origine : {0}", e.InnerException.Console.WriteLine("L’erreur suivante s’est produite : [Code={0},Message={1}{2}]", e.Code, e.Message, msg == // arrêt programmeEnvironment.Exit(1);}// boucle infiniewhile (true) {...

12345678910111213141516171819202122232425262728

using System;using Metier;using Dao;using Entites;using Spring.Context;using Spring.Context.Support;// on crée les couches [metier et dao]IApplicationContext ctx = null;try {// contexte Springctx = ContextRegistry.GetContext();} catch (Exception e1) {// affichage erreurConsole.WriteLine("Chaîne des exceptions : \ n{0}", "".PadLeft(40, ’-’));Exception e = e1;while (e != null) {Console.WriteLine("{0}: {1}", e.GetType().FullName, e.Message);Console.WriteLine("".PadLeft(40, ’-’));e = e.InnerException;}// arrêt programmeEnvironment.Exit(1);}// on demande une référence sur la couche [metier]IImpotMetier metier = (IImpotMetier)ctx.GetObject("metier");// boucle infiniewhile (true) {....................................

Paramètres du calcul de l’Impot au format : Marié (o/n) NbEnfants Salaire ou rien pour arrêter :o 2

?

?

Site du Gaci - La couche Spring http://sitedugaci.com/33/3/tutoriel/chapitre/la-couche-spring.html

5 sur 7 3/30/2016 8:23 AM

Autres cours de la même catégorie:

Lorsqu’on exécute le projet [ui] avec un fichier [DataImpotInexistant.txt] inexistant,

on obtient les résultats suivants :

• ligne 17 : l’exception originelle de type [FileNotFoundException]• ligne 15 : la couche [dao] encapsule cette exception dans un type [Entites.ImpotException]• ligne 9 : l’exception lancée par Spring parce qu’il n’a pas réussi à instancier l’objet nommé "dao". Dans leprocessus de création de cet objet, deux autres exceptions sont intervenues auparavant : celles des lignes 11et 13 .• parce que l’objet "dao" n’a pu être créé, le contexte de l’application n’a pu être créé. C’est le sens del’exception ligne 5. Auparavant, une autre exception, celle de la ligne 7 s’était produite .• ligne 3 : l’exception de plus haut niveau, la dernière de la chaîne : une erreur de configuration est signalée.De tout cela, on retiendra que c’est l’exception la plus profonde, ici celle de la ligne 17 qui est souvent laplus significative. On notera cependant que Spring a conservé le message d’erreur de la ligne 17 pour leremonter à l’exception de plus haut niveau ligne 3 afin d’avoir la cause originelle de l’erreur au niveau leplus haut.Spring mérite à lui tout seul un tuto . Nous n’avons fait ici qu’effleurer le sujet . On pourra l’approfondiravec le document [spring-net-reference.pdf] qu’on trouve dans le dossier d’installation de Spring :

On pourra lire également [http://tahe.developpez.com/dotnet/springioc], un tutoriel Spring présenté dans uncontexte VB.NET .

C’est ici qu’on va dire «Au revoir» à l’interface console de notre application pour dire Bonjour à l’InterfaceGraphique que tous le monde attendaient depuis des années . Et ça ??? Dès le prochain chapitre, allezGo,… chacun avec son jerry souris

| |

Connectez-vous ou soit enregistrez-vous gratuitement pour poster le commentaire

Commentaires:

60000 Impot=4282 euros

123<object name="dao" type="Dao.FileImpot, ImpotsV5-dao"><constructor-arg index="0" value="DataImpotInexistant.txt"/></object>

1. Chaîne des exceptions :2. ----------------------------------------3. System.Configuration.ConfigurationErrorsException: Error creating context ’spring.root’: Could notfind file ’C:\ data\ 2007-2008\ c# 2008\ poly\ Chap4\ ImpotsV5\ ui\ bin\ Release\DataImpotInexistant.txt’.4. ----------------------------------------5. Spring.Util.FatalReflectionException: Cannot instantiate Type[Spring.Context.Support.XmlApplicationContext] using ctor [Void .ctor(System.String, Boolean,System.String[])] : ’Exception has been thrown by the target of an invocation.’6. ----------------------------------------7. System.Reflection.TargetInvocationException: Exception has been thrown by the target of aninvocation.8. ----------------------------------------9. Spring.Objects.Factory.ObjectCreationException: Error creating object with name’dao’ defined in’config [spring/objects]’ : Initialization of object failed : Cannot instantiate Type [Dao.FileImpot] usingctor [Void .ctor(System.String)] :’Exception has been thrown by the target of an invocation.’10. ----------------------------------------11. Spring.Util.FatalReflectionException: Cannot instantiate Type [Dao.FileImpot] using ctor [Void.ctor(System.String)] : ’Exception has been thrown by the targetof an invocation.’12. ----------------------------------------13. System.Reflection.TargetInvocationException: Exception has been thrown by the target of aninvocation.14. ----------------------------------------15. Entites.ImpotException: Erreur lors de la lecture du fichier DataImpotInexistant.txt16. ----------------------------------------17. System.IO.FileNotFoundException: Could not find file ’C:\ data\ 2007-2008\ c# 2008\ poly\ Chap4\ImpotsV5\ ui\ bin\ Release\ DataImpotInexistant.txt’.

Nom d'utilisateur :Mot de passe :

Mot de passe oublié ?Connexion auto.

Auteur:

?

Site du Gaci - La couche Spring http://sitedugaci.com/33/3/tutoriel/chapitre/la-couche-spring.html

6 sur 7 3/30/2016 8:23 AM

Facebook Twitter Courriel Forum Tel: +00243 9 90 58 41 53

EtudesCoursArticlesProjets

Groupe GaciEquipe ActuelleDétail sur SdGLivre d'or

ActualitésNews informatiquesNews sur les tutorielsNews sur les articles

CommunautéForumEspace MembreVos projets

À ProposSdGNous ContacterSignaler bug

Termes d'utilisation | Politique et la vie privée | Nous Contacter Copyright © 2012 Ders21. Tous Droits Réservés

Site du Gaci - La couche Spring http://sitedugaci.com/33/3/tutoriel/chapitre/la-couche-spring.html

7 sur 7 3/30/2016 8:23 AM