SlideShare ist ein Scribd-Unternehmen logo
1 von 26
Julien Sadaoui
@juliensadaoui @ippontech
Injection de dépendances et
type-safe binding avec Spring
Type-safe avec Spring ?
Pourquoi ?
● Typage fort sur nos dépendances
● Comportement similaire à CDI (JSR 299)
Comment ?
● Utilisation de @Qualifier depuis Spring 2.5
● Ou @javax.inject.Qualifier depuis Spring 3.0
Use cases
● Un service de paiement peut effectuer une transaction
bancaire de plusieurs façons différentes, selon le moyen de
paiement du client.
Injection avec Spring
Injection classique
@Service
public class PaymentServiceImpl implements PaymentService {
// ...
}
public class PaymentClient {
@Autowired
private PaymentService paymentService;
}
Cas le plus simple et le plus classique :
un seul bean d’un certain type,
et un point d’injection avec ce type ...
Plusieurs implémentations ...
@Service
public class MasterCardPaymentService implements PaymentService {
// ...
}
@Service
public class VisaPaymentService implements PaymentService {
// ...
}
public class PaymentClient {
@Autowired
private PaymentService paymentService;
}
Plusieurs implémentations ...
@Service
public class MasterCardPaymentService implements PaymentService {
// ...
}
@Service
public class VisaPaymentService implements PaymentService {
// ...
}
public class PaymentClient {
@Autowired // ambiguïté sur le point d'injection
private PaymentService paymentService;
}
Résolution avec le nom du bean
public class PaymentClient {
@Inject
private PaymentService visaPaymentService;
}
public class PaymentClient {
@Inject
@Qualifier(“visaPaymentService”)
private PaymentService paymentService;
}
● Le nom de la variable associé au point d’injection
● Lever l'ambiguïté avec l’annotation @Qualifier
Nommage des beans
@Service(“visa”)
public class VisaPaymentService implements PaymentService {
// ...
}
@Service => visaPaymentService
public class VisaPaymentService implements PaymentService {
// ...
}
● Spécifier le nom avec l’attribut “value” @Service
● Par défaut, c’est le nom de classe non qualifié
Résolution avec @Qualifier
@Service
@Qualifier(“visa”)
public class VisaCardPaymentService implements PaymentService {
// ...
}
public class PaymentClient {
@Inject
@Qualifier(“visa”)
private PaymentService paymentService;
}
● On peut qualifier explicitement un bean avec l’annotation
Qualifier (ne correspond pas à son nom)
Injection avec @Qualifier
Injection avec @Qualifier
@Target({FIELD, TYPE, METHOD, PARAMETER})
@Retention(RUNTIME)
@Qualifier
public @interface MasterCard {
}
@Target({FIELD, TYPE, METHOD, PARAMETER})
@Retention(RUNTIME)
@Qualifier
public @interface Visa {
}
Injection avec @Qualifier
@Service
@MasterCard
public class MasterCardPaymentService implements PaymentService {
// ...
}
@Service
@Visa
public class VisaPaymentService implements PaymentService {
// ...
}
Injection avec @Qualifier
public class PaymentResource {
@Autowired @Visa
private PaymentService visa;
@Autowired @MasterCard
private PaymentService masterCard;
// ...
}
Qualifier avec membres
Qualifier avec membres
@Target({FIELD,TYPE,METHOD,PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Payment {
PaymentMethod value();
public static enum PaymentMethod {
VISA,
MASTER_CARD,
PAYPAL
}
}
Qualifier avec membres
@Service
@Payment(PaymentMethod.VISA)
public class VisaPaymentService implements PaymentService {
// ...
}
@Service
@Payment(PaymentMethod.PAYPAL)
public class PaypalPaymentService implements PaymentService {
// ...
}
Qualifier avec membres
public class PaymentClient {
@Autowired
@Payment(PaymentMethod.VISA)
private PaymentService visa;
@Autowired
@Payment(PaymentMethod.PAYPAL)
private PaymentService paypal;
// ...
}
Support de la JSR 330
Support de la JSR 330
● API légère pour l’injection de dépendances
● On peut utiliser les annotations standards de la JSR 330
depuis Spring 3.0
Spring javax.inject.*
@Autowired @Inject
@Component @Named
@Qualifier @Qualifier
Support de la JSR 330
@Target({FIELD,TYPE,METHOD,PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@javax.inject.Qualifier
public @interface Payment {
PaymentMethod value();
public static enum PaymentMethod {
VISA,
MASTER_CARD,
PAYPAL
}
}
Support de la JSR 330
@Named
@Payment(PaymentMethod.VISA)
public class VisaPaymentService implements PaymentService {
// ...
}
@Named
@Payment(PaymentMethod.PAYPAL)
public class PaypalPaymentService implements PaymentService {
// ...
}
Support de la JSR 330
public class PaymentService {
@Inject
@Payment(PaymentMethod.VISA)
private PaymentService visa;
@Inject
@Payment(PaymentMethod.PAYPAL)
private PaymentService paypal;
// ...
}
Conclusion
● Plus propre comme injection
● Couplage faible avec typage fort
● Utilisation des annotations à la place des chaînes
de caractères
● Disponible depuis Spring 2.5
● Compatible avec la JSR 330
Liens utiles
Guide de références
http://docs.spring.io/spring/docs/current/spring-framework-
reference/htmlsingle/#beans-autowired-annotation-qualifiers
Blogs de spring
http://spring.io/blog/2014/11/04/a-quality-qualifier
Exemples des slides
https://github.com/juliensadaoui/ippevent2015-youngblood
@juliensadaoui
juliensadaoui
@ippontech
blog.ippon.fr

Weitere ähnliche Inhalte

Andere mochten auch

El endeudamiento de los estados
El endeudamiento de los estadosEl endeudamiento de los estados
El endeudamiento de los estadosStkpha
 
Adéquation Formation - Emploi
Adéquation Formation - EmploiAdéquation Formation - Emploi
Adéquation Formation - EmploiRéda ALLAL
 
Ben Laden Au Paradis G
Ben Laden Au Paradis   GBen Laden Au Paradis   G
Ben Laden Au Paradis Geric4274
 
PréSentation Action&DéVeloppement
PréSentation Action&DéVeloppementPréSentation Action&DéVeloppement
PréSentation Action&DéVeloppementgenmeca
 
Brochure ballons sacs à dos 0315
Brochure ballons sacs à dos   0315Brochure ballons sacs à dos   0315
Brochure ballons sacs à dos 0315pubeo
 
Spintank Opinion Way Les FrançAis Et Les Processus Participatifs De Marque En...
Spintank Opinion Way Les FrançAis Et Les Processus Participatifs De Marque En...Spintank Opinion Way Les FrançAis Et Les Processus Participatifs De Marque En...
Spintank Opinion Way Les FrançAis Et Les Processus Participatifs De Marque En...Julian Dufoulon
 
Principios paravivirmejor partei_walter_riso[1]
Principios paravivirmejor partei_walter_riso[1]Principios paravivirmejor partei_walter_riso[1]
Principios paravivirmejor partei_walter_riso[1]juaymaenz
 
Libqual+ à l'Université d'Angers (màj 2010)
Libqual+ à l'Université d'Angers (màj 2010)Libqual+ à l'Université d'Angers (màj 2010)
Libqual+ à l'Université d'Angers (màj 2010)Nicolas Alarcon
 
Sont futés .. et riches ces émirs
Sont futés .. et riches ces émirs Sont futés .. et riches ces émirs
Sont futés .. et riches ces émirs eric4274
 
Lextant Overview 03 09
Lextant Overview 03 09Lextant Overview 03 09
Lextant Overview 03 09JIM COUCH
 
Optativas presentacion gral año 2014 - fundamentos - versión final
Optativas   presentacion gral año 2014 - fundamentos - versión finalOptativas   presentacion gral año 2014 - fundamentos - versión final
Optativas presentacion gral año 2014 - fundamentos - versión finalinfounlp
 
Presentation du collectif des ahndicapés pour l'insertion, la formation et l'...
Presentation du collectif des ahndicapés pour l'insertion, la formation et l'...Presentation du collectif des ahndicapés pour l'insertion, la formation et l'...
Presentation du collectif des ahndicapés pour l'insertion, la formation et l'...Bassirou Ngom
 
Columbia portage glacier iii doudoune homme gris - taille xl
Columbia portage glacier iii doudoune homme   gris - taille xlColumbia portage glacier iii doudoune homme   gris - taille xl
Columbia portage glacier iii doudoune homme gris - taille xlsabaron32421
 
Campagne Mercedes Classe A
Campagne Mercedes Classe ACampagne Mercedes Classe A
Campagne Mercedes Classe Amaximebaumard
 
Evolución de la comunicación humana
Evolución de la comunicación humanaEvolución de la comunicación humana
Evolución de la comunicación humanaVanne Pérez
 
Ii propriétés des fluides
Ii   propriétés des fluidesIi   propriétés des fluides
Ii propriétés des fluidesZahir Hadji
 

Andere mochten auch (19)

El endeudamiento de los estados
El endeudamiento de los estadosEl endeudamiento de los estados
El endeudamiento de los estados
 
Manuel niveau I
Manuel niveau IManuel niveau I
Manuel niveau I
 
Adéquation Formation - Emploi
Adéquation Formation - EmploiAdéquation Formation - Emploi
Adéquation Formation - Emploi
 
Ben Laden Au Paradis G
Ben Laden Au Paradis   GBen Laden Au Paradis   G
Ben Laden Au Paradis G
 
PréSentation Action&DéVeloppement
PréSentation Action&DéVeloppementPréSentation Action&DéVeloppement
PréSentation Action&DéVeloppement
 
Brochure ballons sacs à dos 0315
Brochure ballons sacs à dos   0315Brochure ballons sacs à dos   0315
Brochure ballons sacs à dos 0315
 
Spintank Opinion Way Les FrançAis Et Les Processus Participatifs De Marque En...
Spintank Opinion Way Les FrançAis Et Les Processus Participatifs De Marque En...Spintank Opinion Way Les FrançAis Et Les Processus Participatifs De Marque En...
Spintank Opinion Way Les FrançAis Et Les Processus Participatifs De Marque En...
 
Reteatro dossier2014
Reteatro dossier2014Reteatro dossier2014
Reteatro dossier2014
 
Principios paravivirmejor partei_walter_riso[1]
Principios paravivirmejor partei_walter_riso[1]Principios paravivirmejor partei_walter_riso[1]
Principios paravivirmejor partei_walter_riso[1]
 
Umbria
Umbria Umbria
Umbria
 
Libqual+ à l'Université d'Angers (màj 2010)
Libqual+ à l'Université d'Angers (màj 2010)Libqual+ à l'Université d'Angers (màj 2010)
Libqual+ à l'Université d'Angers (màj 2010)
 
Sont futés .. et riches ces émirs
Sont futés .. et riches ces émirs Sont futés .. et riches ces émirs
Sont futés .. et riches ces émirs
 
Lextant Overview 03 09
Lextant Overview 03 09Lextant Overview 03 09
Lextant Overview 03 09
 
Optativas presentacion gral año 2014 - fundamentos - versión final
Optativas   presentacion gral año 2014 - fundamentos - versión finalOptativas   presentacion gral año 2014 - fundamentos - versión final
Optativas presentacion gral año 2014 - fundamentos - versión final
 
Presentation du collectif des ahndicapés pour l'insertion, la formation et l'...
Presentation du collectif des ahndicapés pour l'insertion, la formation et l'...Presentation du collectif des ahndicapés pour l'insertion, la formation et l'...
Presentation du collectif des ahndicapés pour l'insertion, la formation et l'...
 
Columbia portage glacier iii doudoune homme gris - taille xl
Columbia portage glacier iii doudoune homme   gris - taille xlColumbia portage glacier iii doudoune homme   gris - taille xl
Columbia portage glacier iii doudoune homme gris - taille xl
 
Campagne Mercedes Classe A
Campagne Mercedes Classe ACampagne Mercedes Classe A
Campagne Mercedes Classe A
 
Evolución de la comunicación humana
Evolución de la comunicación humanaEvolución de la comunicación humana
Evolución de la comunicación humana
 
Ii propriétés des fluides
Ii   propriétés des fluidesIi   propriétés des fluides
Ii propriétés des fluides
 

Ähnlich wie Ippevent Young Blood - Injection de dépendance et type safe binding avec spring

Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootDNG Consulting
 
laravel.sillo.org-Cours Laravel 10 les bases la validation.pdf
laravel.sillo.org-Cours Laravel 10  les bases  la validation.pdflaravel.sillo.org-Cours Laravel 10  les bases  la validation.pdf
laravel.sillo.org-Cours Laravel 10 les bases la validation.pdfHeartKing10
 
gestion Comptes Bancaire SpringBoot-Exemple.pdf
gestion Comptes Bancaire SpringBoot-Exemple.pdfgestion Comptes Bancaire SpringBoot-Exemple.pdf
gestion Comptes Bancaire SpringBoot-Exemple.pdfMohamedHassoun11
 
JWT-spring-boot-avancer.pdf
JWT-spring-boot-avancer.pdfJWT-spring-boot-avancer.pdf
JWT-spring-boot-avancer.pdfJaouad Assabbour
 
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfRAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfSouf212
 
Presentation Spring, Spring MVC
Presentation Spring, Spring MVCPresentation Spring, Spring MVC
Presentation Spring, Spring MVCNathaniel Richand
 

Ähnlich wie Ippevent Young Blood - Injection de dépendance et type safe binding avec spring (6)

Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
 
laravel.sillo.org-Cours Laravel 10 les bases la validation.pdf
laravel.sillo.org-Cours Laravel 10  les bases  la validation.pdflaravel.sillo.org-Cours Laravel 10  les bases  la validation.pdf
laravel.sillo.org-Cours Laravel 10 les bases la validation.pdf
 
gestion Comptes Bancaire SpringBoot-Exemple.pdf
gestion Comptes Bancaire SpringBoot-Exemple.pdfgestion Comptes Bancaire SpringBoot-Exemple.pdf
gestion Comptes Bancaire SpringBoot-Exemple.pdf
 
JWT-spring-boot-avancer.pdf
JWT-spring-boot-avancer.pdfJWT-spring-boot-avancer.pdf
JWT-spring-boot-avancer.pdf
 
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfRAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
 
Presentation Spring, Spring MVC
Presentation Spring, Spring MVCPresentation Spring, Spring MVC
Presentation Spring, Spring MVC
 

Ippevent Young Blood - Injection de dépendance et type safe binding avec spring

  • 1. Julien Sadaoui @juliensadaoui @ippontech Injection de dépendances et type-safe binding avec Spring
  • 2. Type-safe avec Spring ? Pourquoi ? ● Typage fort sur nos dépendances ● Comportement similaire à CDI (JSR 299) Comment ? ● Utilisation de @Qualifier depuis Spring 2.5 ● Ou @javax.inject.Qualifier depuis Spring 3.0
  • 3. Use cases ● Un service de paiement peut effectuer une transaction bancaire de plusieurs façons différentes, selon le moyen de paiement du client.
  • 5. Injection classique @Service public class PaymentServiceImpl implements PaymentService { // ... } public class PaymentClient { @Autowired private PaymentService paymentService; } Cas le plus simple et le plus classique : un seul bean d’un certain type, et un point d’injection avec ce type ...
  • 6. Plusieurs implémentations ... @Service public class MasterCardPaymentService implements PaymentService { // ... } @Service public class VisaPaymentService implements PaymentService { // ... } public class PaymentClient { @Autowired private PaymentService paymentService; }
  • 7. Plusieurs implémentations ... @Service public class MasterCardPaymentService implements PaymentService { // ... } @Service public class VisaPaymentService implements PaymentService { // ... } public class PaymentClient { @Autowired // ambiguïté sur le point d'injection private PaymentService paymentService; }
  • 8. Résolution avec le nom du bean public class PaymentClient { @Inject private PaymentService visaPaymentService; } public class PaymentClient { @Inject @Qualifier(“visaPaymentService”) private PaymentService paymentService; } ● Le nom de la variable associé au point d’injection ● Lever l'ambiguïté avec l’annotation @Qualifier
  • 9. Nommage des beans @Service(“visa”) public class VisaPaymentService implements PaymentService { // ... } @Service => visaPaymentService public class VisaPaymentService implements PaymentService { // ... } ● Spécifier le nom avec l’attribut “value” @Service ● Par défaut, c’est le nom de classe non qualifié
  • 10. Résolution avec @Qualifier @Service @Qualifier(“visa”) public class VisaCardPaymentService implements PaymentService { // ... } public class PaymentClient { @Inject @Qualifier(“visa”) private PaymentService paymentService; } ● On peut qualifier explicitement un bean avec l’annotation Qualifier (ne correspond pas à son nom)
  • 12. Injection avec @Qualifier @Target({FIELD, TYPE, METHOD, PARAMETER}) @Retention(RUNTIME) @Qualifier public @interface MasterCard { } @Target({FIELD, TYPE, METHOD, PARAMETER}) @Retention(RUNTIME) @Qualifier public @interface Visa { }
  • 13. Injection avec @Qualifier @Service @MasterCard public class MasterCardPaymentService implements PaymentService { // ... } @Service @Visa public class VisaPaymentService implements PaymentService { // ... }
  • 14. Injection avec @Qualifier public class PaymentResource { @Autowired @Visa private PaymentService visa; @Autowired @MasterCard private PaymentService masterCard; // ... }
  • 16. Qualifier avec membres @Target({FIELD,TYPE,METHOD,PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Qualifier public @interface Payment { PaymentMethod value(); public static enum PaymentMethod { VISA, MASTER_CARD, PAYPAL } }
  • 17. Qualifier avec membres @Service @Payment(PaymentMethod.VISA) public class VisaPaymentService implements PaymentService { // ... } @Service @Payment(PaymentMethod.PAYPAL) public class PaypalPaymentService implements PaymentService { // ... }
  • 18. Qualifier avec membres public class PaymentClient { @Autowired @Payment(PaymentMethod.VISA) private PaymentService visa; @Autowired @Payment(PaymentMethod.PAYPAL) private PaymentService paypal; // ... }
  • 19. Support de la JSR 330
  • 20. Support de la JSR 330 ● API légère pour l’injection de dépendances ● On peut utiliser les annotations standards de la JSR 330 depuis Spring 3.0 Spring javax.inject.* @Autowired @Inject @Component @Named @Qualifier @Qualifier
  • 21. Support de la JSR 330 @Target({FIELD,TYPE,METHOD,PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @javax.inject.Qualifier public @interface Payment { PaymentMethod value(); public static enum PaymentMethod { VISA, MASTER_CARD, PAYPAL } }
  • 22. Support de la JSR 330 @Named @Payment(PaymentMethod.VISA) public class VisaPaymentService implements PaymentService { // ... } @Named @Payment(PaymentMethod.PAYPAL) public class PaypalPaymentService implements PaymentService { // ... }
  • 23. Support de la JSR 330 public class PaymentService { @Inject @Payment(PaymentMethod.VISA) private PaymentService visa; @Inject @Payment(PaymentMethod.PAYPAL) private PaymentService paypal; // ... }
  • 24. Conclusion ● Plus propre comme injection ● Couplage faible avec typage fort ● Utilisation des annotations à la place des chaînes de caractères ● Disponible depuis Spring 2.5 ● Compatible avec la JSR 330
  • 25. Liens utiles Guide de références http://docs.spring.io/spring/docs/current/spring-framework- reference/htmlsingle/#beans-autowired-annotation-qualifiers Blogs de spring http://spring.io/blog/2014/11/04/a-quality-qualifier Exemples des slides https://github.com/juliensadaoui/ippevent2015-youngblood