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

Contenu connexe

PDF
Digital frontier
PDF
Penser l'ennemi article RDN
PPTX
La Accesibilidad Web es posible: Natalia ascani
PPTX
Pâques à antsirabe
PPTX
Equipo twitteras, grupo 5.rol del-asesor-en-línea-para-una-comunidad
PDF
Diversité-Culturelle_OIF_Vietnam
PDF
La piel-de-centroamerica-edelberto-torres
PPTX
Archives, patrimoine et médiation culturelle - Seance 2
Digital frontier
Penser l'ennemi article RDN
La Accesibilidad Web es posible: Natalia ascani
Pâques à antsirabe
Equipo twitteras, grupo 5.rol del-asesor-en-línea-para-una-comunidad
Diversité-Culturelle_OIF_Vietnam
La piel-de-centroamerica-edelberto-torres
Archives, patrimoine et médiation culturelle - Seance 2

En vedette (19)

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

Similaire à Ippevent Young Blood - Injection de dépendance et type safe binding avec spring (6)

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

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