Les secrets du conteneur Spring vous attendent pour ce 3ième workshop sur le framework Spring : module spring-test, injection de beans de portées différentes, support des JSR 250 et 330, post-processeurs de beans, fichiers de configuration et abstraction de l’accès aux ressources.
Découvrez le framework web Spring Boot qui a la cote !
Apprenez comment son système d'auto-configuration fonctionne.
Live coding et exemple de migration vers Spring Boot sont de la partie.
Workshop Spring - Session 1 - L'offre Spring et les basesAntoine Rey
Rejoignez les millions de développeurs Spring
De par sa forte pénétration dans les entreprises, tout développeur Java /JEE a ou aura à travailler sur une application s’appuyant sur Spring. Or Spring dépasse le cadre du simple framework open source.
Cette série de 5 workshops a pour objectif de faire un tour d’horizon de l’écosystème des technologies supportées par Spring avant de se focaliser plus spécifiquement sur certaines d’entre elles.
Retours d’expérience, bonnes pratiques, techniques avancées seront de partie.
Propulsée dans Java EE 6 avec CDI et plus récemment au sein de JavaScript avec Google Gin, l’injection de dépendance sera au cœur du premier workshop.
Voici le support de présentation du workshop sur Spring que j'ai animé en novembre 2011 au sein de ma SSII et que j'ai réactualisé avant sa diffusion sur Slideshare.
Au sommaire du workshop :
1. Zoom sur le portfolio Spring Source
1. Le cœur du framework Spring : IoC, AOP et support
2. Le support proposé par Spring : persistance, présentation, communication, test, outils …
2. Les fondamentaux
1. Fonctionnement du conteneur léger
2. Les beans Spring
3. Les design patterns rencontrés dans Spring
Chaque jour, de nombreux développeurs utilisent le framework Spring pour l’injection de dépendances et la gestion des transactions. Majeures, ces 2 fonctionnalités ne nécessitent pas un gros effort d’apprentissage. Pour autant, leurs mises en œuvre par le framework est complexe. Par curiosité intellectuelle, mais également afin d’éviter certains pièges et de profiter pleinement des capacités de Spring, il est intéressant de comprendre les mécanismes internes du framework qu’on utilise au quotidien : cycle de vie d’un bean, proxy, intercepteur, post-processeur, fabrique de beans, hiérarchie de contextes, portée …
Les slides de cette présentation ont pour objectif de vous les faire les introduire.
Workshop Spring - Session 5 - Spring IntegrationAntoine Rey
Vous avez déjà entendu parler d’Apache Camel ?
Les Design Pattern n’ont plus de secrets pour vous ?
L’Event Driven Architecture vous attire ?
Les Enterprise Integration Pattern vous interpellent ?
Vos applications reposent sur TCP, JMS, FTP, SFTP, les fichiers, les mails, XML, les web services SOAP, REST, RSS, JPA, JDBC ou même Twitter ?
N’attendez plus : venez découvrir l’utilisation des patterns comme le Channel Adapter, le Router ou l’Aggregator au travers d’un workshop sur Spring Integration.
Voici le support de présentation d’un workshop d’1h s’appuyant sur le cas d’étude suivant : un moteur chargé d’indexer des données clients dans le moteur de recherche Elasticsearch.
Une connaissance minimaliste de Spring Framework est pré-requise.
Spring Integration est à votre portée de main. EAI et ESB n’ont qu’à bien se tenir !!
Découvrez le framework web Spring Boot qui a la cote !
Apprenez comment son système d'auto-configuration fonctionne.
Live coding et exemple de migration vers Spring Boot sont de la partie.
Workshop Spring - Session 1 - L'offre Spring et les basesAntoine Rey
Rejoignez les millions de développeurs Spring
De par sa forte pénétration dans les entreprises, tout développeur Java /JEE a ou aura à travailler sur une application s’appuyant sur Spring. Or Spring dépasse le cadre du simple framework open source.
Cette série de 5 workshops a pour objectif de faire un tour d’horizon de l’écosystème des technologies supportées par Spring avant de se focaliser plus spécifiquement sur certaines d’entre elles.
Retours d’expérience, bonnes pratiques, techniques avancées seront de partie.
Propulsée dans Java EE 6 avec CDI et plus récemment au sein de JavaScript avec Google Gin, l’injection de dépendance sera au cœur du premier workshop.
Voici le support de présentation du workshop sur Spring que j'ai animé en novembre 2011 au sein de ma SSII et que j'ai réactualisé avant sa diffusion sur Slideshare.
Au sommaire du workshop :
1. Zoom sur le portfolio Spring Source
1. Le cœur du framework Spring : IoC, AOP et support
2. Le support proposé par Spring : persistance, présentation, communication, test, outils …
2. Les fondamentaux
1. Fonctionnement du conteneur léger
2. Les beans Spring
3. Les design patterns rencontrés dans Spring
Chaque jour, de nombreux développeurs utilisent le framework Spring pour l’injection de dépendances et la gestion des transactions. Majeures, ces 2 fonctionnalités ne nécessitent pas un gros effort d’apprentissage. Pour autant, leurs mises en œuvre par le framework est complexe. Par curiosité intellectuelle, mais également afin d’éviter certains pièges et de profiter pleinement des capacités de Spring, il est intéressant de comprendre les mécanismes internes du framework qu’on utilise au quotidien : cycle de vie d’un bean, proxy, intercepteur, post-processeur, fabrique de beans, hiérarchie de contextes, portée …
Les slides de cette présentation ont pour objectif de vous les faire les introduire.
Workshop Spring - Session 5 - Spring IntegrationAntoine Rey
Vous avez déjà entendu parler d’Apache Camel ?
Les Design Pattern n’ont plus de secrets pour vous ?
L’Event Driven Architecture vous attire ?
Les Enterprise Integration Pattern vous interpellent ?
Vos applications reposent sur TCP, JMS, FTP, SFTP, les fichiers, les mails, XML, les web services SOAP, REST, RSS, JPA, JDBC ou même Twitter ?
N’attendez plus : venez découvrir l’utilisation des patterns comme le Channel Adapter, le Router ou l’Aggregator au travers d’un workshop sur Spring Integration.
Voici le support de présentation d’un workshop d’1h s’appuyant sur le cas d’étude suivant : un moteur chargé d’indexer des données clients dans le moteur de recherche Elasticsearch.
Une connaissance minimaliste de Spring Framework est pré-requise.
Spring Integration est à votre portée de main. EAI et ESB n’ont qu’à bien se tenir !!
Spring Meetup Paris - Back to the basics of Spring (Boot)Eric SIBER
Aujourd'hui, avec Spring Boot, la promesse est de pouvoir bootstrapper en 60 secondes chrono une application.
C'est génial et porteur de sens (et un vrai laboratoire de bonnes pratiques) mais le temps de bootstrapping de l'équipe de développement, des individus composant cette équipe, est bien loin de suivre la même célérité. Dans le pire des cas, vous rencontrerez même des équipes au sein desquelles les écarts de niveaux sont extrêmement importants.
Pourquoi donc ? Réfléchissez à ce qui se passe si vous donnez le volant d'une formule 1 à quelqu'un qui vient tout juste d'obtenir son permis A après avoir fait son apprentissage sur une petite citadine dans une grande ville ... et vous aurez un début de réponse.
Le portfolio Spring constitue une excellente et populaire boîte à outils qui vous promet une grande productivité. Pour tirer profit de cette productivité et ne pas rester bridé par les connaissances de l'équipe, il ne suffit pas de choisir le bon framework, il faut savoir comment l'utiliser, le sublimer, en épousant les paradigmes de ce dernier.
Je vous propose donc d'en revenir aux fondamentaux de Spring (Boot) afin de vous permettre, bien avant de pouvoir vous attaquer au graal des architectures Microservices, d'être capable de tirer la pleine puissance du framework, tout du moins de ne pas en détourner l'essence.
Si vous n'êtes pas familier de Spring, ce talk vous permettra d'en avoir un premier aperçu pragmatique sans effet waouh. Si vous connaissez déjà Spring, vous trouverez à travers ce talk l'opportunité de prendre du recul sur son usage et de confronter vos pratiques aux patterns et bénéficies qu'il vous offre.
Tester unitairement une application javaAntoine Rey
Présente les différents types de tests automatisés, les objectifs des tests unitaires, les stratégies de mise en œuvre, les bonnes pratiques, les difficultés, ce qu'est un mock, différents outils (Unitils, Mockito, DbUnit, Spring Test) et des exemples de tests (DAO et contrôleurs Spring MVC), sans oublier le test de code legacy.
Microbox : Ma toolbox microservices - Julien Royekino
Malgré les bénéfices indéniables des architectures microservices, elles apportent une complexité non négligeable. Durant cette session, je vous présenterai la collection d’outils open source ou développé en interne que nous utilisons sur nos différents projets microservices pour limiter les délais de mise en oeuvre de ce type d’architecture. Depuis la gestion des sources jusqu’au monitoring en passant par la génération de projets et l’usine de build nous parcourrons en live l’utilisation de ces différents outils.
Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes from the name of its source module (spring-webmvc), but it is more commonly known as “Spring MVC”.
Parallel to Spring Web MVC, Spring Framework 5.0 introduced a reactive-stack web framework whose name, “Spring WebFlux,” is also based on its source module (spring-webflux). This section covers Spring Web MVC.
Découvrir Spring-Batch, l'assimiler, et ainsi pourvoir détecter les cas d'usage et enfin pouvoir en faire.
GitHub : https://github.com/mmohamed/spring-batch
Microservices with .Net - NDC Sydney, 2016Richard Banks
Presented at NDC Sydney, August 2016
Thanks to organisations like Netflix, and the need to develop solutions that scale well in the cloud, microservices have become the hot new topic. Yet, for all the talk, there are few practical examples of how you actually build a microservice in .NET.
It's time to fix that little oversight as we show you how you can build a microservices based solution using .NET, and a number of open source tools (EventStore, RabbitMq and Redis to name a few).
You'll also get to understand the pros and cons of a microservices solution and consider how a microservices approach might impact how you and your team relate to your customers.
Spring Meetup Paris - Back to the basics of Spring (Boot)Eric SIBER
Aujourd'hui, avec Spring Boot, la promesse est de pouvoir bootstrapper en 60 secondes chrono une application.
C'est génial et porteur de sens (et un vrai laboratoire de bonnes pratiques) mais le temps de bootstrapping de l'équipe de développement, des individus composant cette équipe, est bien loin de suivre la même célérité. Dans le pire des cas, vous rencontrerez même des équipes au sein desquelles les écarts de niveaux sont extrêmement importants.
Pourquoi donc ? Réfléchissez à ce qui se passe si vous donnez le volant d'une formule 1 à quelqu'un qui vient tout juste d'obtenir son permis A après avoir fait son apprentissage sur une petite citadine dans une grande ville ... et vous aurez un début de réponse.
Le portfolio Spring constitue une excellente et populaire boîte à outils qui vous promet une grande productivité. Pour tirer profit de cette productivité et ne pas rester bridé par les connaissances de l'équipe, il ne suffit pas de choisir le bon framework, il faut savoir comment l'utiliser, le sublimer, en épousant les paradigmes de ce dernier.
Je vous propose donc d'en revenir aux fondamentaux de Spring (Boot) afin de vous permettre, bien avant de pouvoir vous attaquer au graal des architectures Microservices, d'être capable de tirer la pleine puissance du framework, tout du moins de ne pas en détourner l'essence.
Si vous n'êtes pas familier de Spring, ce talk vous permettra d'en avoir un premier aperçu pragmatique sans effet waouh. Si vous connaissez déjà Spring, vous trouverez à travers ce talk l'opportunité de prendre du recul sur son usage et de confronter vos pratiques aux patterns et bénéficies qu'il vous offre.
Tester unitairement une application javaAntoine Rey
Présente les différents types de tests automatisés, les objectifs des tests unitaires, les stratégies de mise en œuvre, les bonnes pratiques, les difficultés, ce qu'est un mock, différents outils (Unitils, Mockito, DbUnit, Spring Test) et des exemples de tests (DAO et contrôleurs Spring MVC), sans oublier le test de code legacy.
Microbox : Ma toolbox microservices - Julien Royekino
Malgré les bénéfices indéniables des architectures microservices, elles apportent une complexité non négligeable. Durant cette session, je vous présenterai la collection d’outils open source ou développé en interne que nous utilisons sur nos différents projets microservices pour limiter les délais de mise en oeuvre de ce type d’architecture. Depuis la gestion des sources jusqu’au monitoring en passant par la génération de projets et l’usine de build nous parcourrons en live l’utilisation de ces différents outils.
Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes from the name of its source module (spring-webmvc), but it is more commonly known as “Spring MVC”.
Parallel to Spring Web MVC, Spring Framework 5.0 introduced a reactive-stack web framework whose name, “Spring WebFlux,” is also based on its source module (spring-webflux). This section covers Spring Web MVC.
Découvrir Spring-Batch, l'assimiler, et ainsi pourvoir détecter les cas d'usage et enfin pouvoir en faire.
GitHub : https://github.com/mmohamed/spring-batch
Microservices with .Net - NDC Sydney, 2016Richard Banks
Presented at NDC Sydney, August 2016
Thanks to organisations like Netflix, and the need to develop solutions that scale well in the cloud, microservices have become the hot new topic. Yet, for all the talk, there are few practical examples of how you actually build a microservice in .NET.
It's time to fix that little oversight as we show you how you can build a microservices based solution using .NET, and a number of open source tools (EventStore, RabbitMq and Redis to name a few).
You'll also get to understand the pros and cons of a microservices solution and consider how a microservices approach might impact how you and your team relate to your customers.
Si vous pensez encore que le data-binding, l’inversion de dépendances, le pattern MVC ou bien encore la gestion de la navigation sont réservés au code Java des applications web modernes, courrez assistez à ce workshop. AngularJS, le dernier framework JavaScript de chez Google, devrait vous surprendre.
Basée sur l’université AngularJS, ou le futur du développement Web présentée lors de Devoxx France 2013, ce workshop a pour objectif de vous initier à AngularJS.
Les concepts fondamentaux seront mis en en action au travers de l’application Game Store.
Côté industrialisation, nous verrons que tests unitaires, tests fonctionnels et infrastructure de build ne sont pas non plus délaissés.
A l’heure où la couche présentation des applications web est de plus en plus déportée côté client, ce workshop a pour objectif de démystifier ce type de framework permettant de structurer une application JavaScript.
Spring Framework Petclinic sample applicationAntoine Rey
Spring Petclinic is a sample application that has been designed to show how the Spring Framework can be used to build simple but powerful database-oriented applications.
The fork named Spring Framework Petclinic maintains a version both with a plain old Spring Framework configuration and a 3-layer architecture (i.e. presentation --> service --> repository).
Liferay france symposium 2012 - montée de version d’une instance liferaySébastien Le Marchand
Les montées de version du produit sont des étapes critiques dans la vie d'une application basée sur Liferay. Le portail Liferay fournit nativement des mécanismes efficaces pour mettre à jour sans difficultés la structure et les données de la base de données Liferay standard, mais une attention importante doit être portée à la migration des données et développements spécifiques, tout particulièrement pour les plugins de type « hook » et les plugins de type « ext ». Pendant cette session, les auditeurs ont bénéficié de retours d'expérience terrain et ont prise connaissance de patterns et d'astuces utiles pour assurer une montée de version en évitant les régressions et en maîtrisant la charge engagée.
Clairement dans cette version, nous assistons à une volonté de simplification. Plus de lisibilité du code, plus d’outils pour ne plus avoir à perdre de temps sur des opérations simples et courantes, pour au final un code de meilleur qualité et plus accessible. La plupart de ces améliorations se trouvent dans cette présentation.
La mode est aux conteneurs. Mais tout le monde n'est pas capable de transformer radicalement son DataCenter pour accueillir ces nouvelles unités de déploiement. Dès lors, le cloud est une alternative plus que valide. Mais il existe de nombreuses façons de déployer son conteneur dans les nuages ! À travers un retour d'expérience basé sur AWS, nous balayerons ces différents patterns, du plus indépendant de l'infrastructure sous jacente, au plus intriqué avec les services managés AWS.
Ce guide fournit un exemple de la manière dont Spring Boot vous aide à accélérer le développement d'applications. Au fur et à mesure que vous lirez plus de guides de démarrage de Spring, vous verrez plus de cas d'utilisation de Spring Boot. Ce guide est destiné à vous donner un aperçu rapide de Spring Boot. Si vous souhaitez créer votre propre projet basé sur Spring Boot, visitez Spring Initializr, remplissez les détails de votre projet, choisissez vos options et téléchargez un projet groupé sous forme de fichier zip.
Similaire à Workshop Spring 3 - Tests et techniques avancées du conteneur Spring (20)
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
1. Workshop Spring - Session 3
Tests & Techniques avancées
du conteneur Spring
Conçu en décembre 2011
Réactualisé en novembre 2014
# 1
2. Sommaire
Tests avec pring-test , DBUnit et Mockito 3
Injection de beans de portées différentes 8
Support des JSR 250 et 330 11
Usage des post-processeurs de bean 13
Externalisation de la configuration 17
Accès aux ressources externes 19
2
3. Spring et les Tests
Conteneur léger accessible aux tests unitaires et
d’intégration
Support de JUnit 4 et TestNG
Chargement du contexte Spring
Injection de dépendances
Mise en cache du contexte
Extensions JUnit par
Runner : SpringJUnit4ClassRunner
Annotations : @ContextConfiguration, @Rollback, @Repeat …
Listeners : DependencyInjectionTestExecutionListener …
Bouchons prêts à l’emploi
MockHttpSession, MockHttpServletRequest,
MockPortletSession ...
3
Les apports du module Spring Test
4. 4
Spring et les Tests
Test d’intégration d’un DAO
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("applicationContext-daos.xml")
@Transactionnal
public class IntTestHibernateAccountDao {
@Autowired
private HibernateAccountDao accountDao;
@Rollback(false)
@Test
public void chargerCompteParIBAN(){
String iban = = "FR70 3000 2005 5000 0015 7845 Z02";
Account account = accountDao.findAccountByIBan(iban);
assertNotNull(account);
assertEquals("Account 1", account.getDescription());
}
}
5. Retour d’Expérience projet
Fixe un cadre technique d’utilisation de frameworks pour les tests :
JUnit, spring-test, DbUnit, H2, Logback et Mockito
Fournit une hiérarchie de classes réutilisables pour écrire un test
unitaire
Selon le besoin : test simple, avec Spring, JDBC, Hibernate, JSF
Dans le but de tester une classe : notion de systemUnderTest (SUT)
Fournit des annotations simplifiant la configuration des tests :
@InjectInto : injection de propriétés dans l’instance testée
@DataSet : charge un dataset DBUnit avant l’exécution du test
@LoggingConfiguration : spécifie le fichier de configuration logback
Outil de génération de dataset XML DbUnit à partir d’entités
Hibernate ou JPA
5
Présentation d’une extension maison
6. 6
Retour d’Expérience projet
Test unitaire d’un DAO avec cette extension
Jeu de données DbUnit : TestHibernateAccountDao-dataset.xml
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<ACCOUNT ID="1" BIC="FR7030002005500000157845Z02" LABEL=“Account 1"/>
<ACCOUNT ID="2" BIC="FR70300023455000021Z4234Y45" LABEL="Account 2"/>
</dataset>
+
@LoggingConfiguration("classpath:logback-test-dao.xml")
public class TestHibernateAccountDao extends
AbstractDatasetSpringContextTest<HibernateAccountDao> {
@Test
public void findAccountByIBan() {
String iban = "FR70 3000 2005 5000 0015 7845 Z02";
Account account = systemUnderTest.findAccountByIBan(iban);
assertNotNull(account);
assertEquals("Account 2", account.getDescription());
}
}
7. 7
Retour d’Expérience projet
Test unitaire d’un service avec cette extension
@LoggingConfiguration("classpath:logback-test-service.xml")
public class TestPublishingService extends
AbstractCustomSpringContextTest<IPublishingService> {
@Mock
@InjectInto
private IPublishingWebService publishingWs;
@Test(expected = UnavailablePublishingException.class) // Assertions
public void generatePDFwithPublishingTimeout () throws
InvalidDataException, UnavailablePublishingException {
// Prépare les données
financialInvestment = new FinancialInvestment();
// Bouchonne les services tiers
when(publishingWs.save(any(Document.class)
.thenThrow(new SocketTimeoutException());
// Exécute le scénario
systemUnderTest.generatePDF(financialInvestment );
}
}
8. Injection de beans de portées différentes
• Rappels
• Un bean de portée Singleton se doit d’être thread-safe
• Par défaut, un singleton est créé au démarrage du conteneur
• Un bean de portée session est créé pour chaque session web utilisateur
• Problématique
– Injecter par auto-wiring un bean de portée Session dans un bean
de portée Singleton
• Cas d’usage
– Avoir accès dans un service métier aux informations de l’utilisateur connecté
– Besoin : contrôle des habilitations, historisation, logs …
• Solution
• Proxifier le bean de portée Session
• Le proxy est chargé d’aiguiller les appels vers le bean session approprié
8
Injecter un bean de portée session dans un singleton (1/2)
@Autowired
protected UserDetails userDetails;
9. 9
Injection de beans de portées différentes
Injecter un bean de portée session dans un singleton (2/2)
Service
singleton
Proxy
Informations
Utilisateur
Conteneur Spring
Contrôleur
singleton
James
session
John
session
+MISE EN OEUVRE
<bean id="authenticatedUserDetails"
scope="session"
class="com.javaetmoi.core.security.UserDetailsFactory"
factory-method="getUserDetails">
<aop:scoped-proxy />
</bean>
getName() getName()
+ILLUSTRATION
Implémentation basée sur le
SecurityContextHolder de Spring
Security
10. Injection de beans de portées différentes
• RAPPEL
– Une nouvelle instance est créée à chaque fois qu’un bean prototype est
référencé
• Problématique
– Avoir un nouveau bean à chaque fois qu’on y fait appel depuis un singleton
– Cas d’usage : Utiliser le pattern commande ou une classe non thread-safe
depuis un singleton
• Solution : Lookup ou injection de méthode
10
Injecter un prototype dans un singleton
<bean id=“contractBuilder"
class=“ContractBuilder"
scope=“prototype“/>
<bean id=“publishingService"
class=“PublishingService">
<lookup-method
name="getContractBuilder"
bean="contractBuilder"/>
</bean>
public abstract class PublishingService {
public void generatePDF() {
ContractBuilder bld = getContractBuilder();
bld.setNumber("CA0000019876")
// ...
}
abstract ContractBuilder getContractBuilder();
}
11. Support des JSR
• Common annotations 1.0
• Introduites dans Java EE 5 et dans Java 6 dans le package javax.annotation
• Leur usage permet de coller aux standards et de se découpler de Spring
• Annotations supportées
• @PostConstruct : méthode appelée une fois le bean instancié et ses
dépendances injectées
• @PreDestroy : méthode appelée avant la destruction du bean
• @RolesAllowed : sécurise l’appel d’une méthode (équivalent à @Secured)
• @Resource : permet d’injecter une ressource JNDI (ex: DataSource)
• Activation des annotations
1. Par un post processeur de beans Spring
<bean class="org.springframework.context.
annotation.CommonAnnotationBeanPostProcessor"/>
2. Ou par la balise XML annotation-config :
<context:annotation-config/>
11
JSR 250 - Common annotations
12. Support des JSR
• API Légère dédiée à l’injection de dépendances
o Standardisation des annotations utilisées dans Spring et Google
Guice
o 5 annotations et 1 interface disponibles dans le package javax.inject :
@Inject @Named, Provider, @Qualifier, @Scope, @Singleton
• Support
o JSR-330 Supportée à 100% par Spring 3.x
o L’annotation @Inject peut se subsTituer à @Autowired
o Les annotations @Qualifier fonctionnent différemment
o Le changement de portée par défaut des beans spring peut être
résolu par la classe Jsr330ScopeMetadataResolver
• Préconisations
o A utiliser pour le développement de frameworks / OSS
o Intéressant dans une application lorsque Spring est uniquement
utilisé comme simple moteur d’injection de dépendances
12
JSR 330 - Dependency Injection for java
13. Usage des post-processeurs de bean
• Caractéristiques
o Appelé pendant le processus de création de tout bean Spring
o Implémente 2 méthodes appelées avant et après la méthode
d’initialisation du bean
o Peuvent être ordonnés
• Etapes de mise à disposition d’un bean
1. Création du bean par constructeur ou appel de méthode statique
2. Valorisation des propriétés du bean
3. Résolution des références vers d’autres beans (wiring)
4. Appel de la méthode postProcessBeforeInitialization() de chaque post-processor
5. Appel des méthodes d’initialisation du bean
6. Appel de la méthode postProcessAfterInitialization() de chaque post-processor
7. Le bean est prêt à être utilisé
13
Fonctionnement
14. Usage des post-processeurs de bean
• Par spring
14
Utilisation au quotidien
Post-Processeur Description
AutowiredAnnotationBeanPostProcessor Active l’auto-wiring via les annotations @Autowired ou
@Inject
CommonAnnotationBeanPostProcessor Active la détection des annotations de la JSR-250
AsyncAnnotationBeanPostProcessor Active la détection de l’annotation @Async
ApplicationContextAwareProcessor Permet de passer le contexte applicatif Spring aux beans
implémentant l’interface ApplicationContextAware
ScriptFactoryPostProcessor Permet d’accéder au résultat de scripts (Groovy, JRuby )
• Par des frameworks tiers
Post-Processeur Description
BusExtensionPostProcessor Active la détection automatique d’extension de bus CXF
Jsr181BeanPostProcessor Support de l’annotation @WebService par XFire
15. Usage des post-processeurs de bean
• Problématique : enregistrer son propre plugin auprès du
conteneur Spring pour traiter les instances de
beans avant leur utilisation
• Cas d’usage : Injecter un logger dans un bean
15
Créer sa propre annotation spring (1/2)
@Service
public class BankingService {
private static final Logger LOGGER =
LoggerFactory.getLogger(BankingService.class);
…
}
@Service
public class BankingService {
@Logger
private static Logger logger;
…
}
16. Usage des post-processeurs de bean
Créer sa propre annotation spring (2/2)
• Solution : créer une annotation et le post-processeur de
bean chargé de l’interprêter
@Retention(RetentionPolicy.RUNTIME) @Target( { ElementType.FIELD })
public @interface Logger {}
public class LoggerBeanPostProcessor implements BeanPostProcessor {
16
public Object postProcessBeforeInitialization(Object bean,
String beanName) {
ReflectionUtils.doWithFields(bean.getClass(),
new ReflectionUtils.FieldCallback() {
public void doWith(Field field) {
if (field.getAnnotation(Logger.class) != null) {
ReflectionUtils.makeAccessible(field);
Logger logger =getLogger(bean.getClass().getName());
ReflectionUtils.setField(field, bean, logger);
} } });
return bean;
} … }
17. Externalisation de la configuration
• Problématique
o Le paramétrage d’une application web dépend de son environnement
o Exemples : URL d’un web service, login / mot de passe, host d’un serveur
mail
o Comment externaliser leur paramétrage ?
• Contraintes
o L’EAR Validé en recette est celui déployé en production
o Les paramètres doivent être externalisés en dehors de l’EAR
o L’externalisation ne doit pas dépendre du serveur d’application
o L’utilisation des URLResource de Websphere sont par exemple écartées
• Solution envisagée
o Utiliser un fichier de configuration qui sera accessible via le classpath
o Activer le post-processeur de fabrique de beans
PropertyPlaceholderConfigurer
17
Etude de Cas dans une application web
18. Externalisation de la configuration
• Fichier de configuration
18
Injection de valeur
Contenu du fichier config.properties:
banking.iban.valid = true
• Chargement par Spring
<context:property-placeholder
location="classpath:com/javaetmoi/config.properties" />
• Code Java
@Service
public class BankingService implements IBankingService{
@Value("${banking.valid.iban}")
private Boolean validIban;
…
}
19. Chargement des ressources externes
• Constat
o Java n’offre pas de mécanisme unifié pour récupérer le contenu
d’une ressource
• Exemples de ressources :
– Fichier texte, fichier de configuration XML, fichier properties, images …
• Exemples de localisation :
– Sur le système de fichier, dans un JAR inclu dans le classpath, via une URL …
• Méthodes possibles
o getClass().getResourceAsStream("path")
o new URL("url").openConnection(). getInputStream()
o new FileInputStream(new File("path"))
• Problématique
o Comment s’abstraire de la localisation d’une ressource ?
19
Méthodes hétérogènes
20. Chargement des ressources externes
• Solution
– Utiliser l’abstraction de ressources proposées par Spring via
l’interface Resource
• Une implémentation par type de localisation
– FileSystemResource, ClassPathResource, UrlResource
• Offre plusieurs fonctionnalités
– Ouverture d’un flux, existante physique, description …
• Localisation d’une ressource
– La syntaxe des chemins d’une ressource est spécifique à Spring
– Spring se base sur le préfixe pour déterminer quelle
implémentation utiliser
20
Un mécanisme Unifié avec Spring
Localisation de la ressource Exemple de chemins
Classpath de la JVM classpath:com/javaetmoi/applicationContext-service.xml
Accessible par une URL http://javaetmoi.com/feed.rss
Sur le système de fichiers file:/d:/appli/demo/config.properties
21. Chargement des ressources externes
• Utilisation par Spring
– En interne, de nombreuses classes du framework utilisent l’interface Resource
– Le contexte applicatif Spring dispose d’un chargeur de ressources
– Exemple : new ClassPathXmlApplicationContext ( tableau de fichiers de conf )
• Injection de Ressources
21
Exemples d’utilisation
public class MailAutomatiqueService {
private Resource mailTemplate;
// Getter
}
<bean id="emailService"
class="com.javaetmoi.EmailService">
<property name="mailTemplate">
<value>classpath:com/javaetmoi/bfa/mail.vl</value>
</property>
</bean>