Simplicité de développement avec Java EE 5 et simplification du lancement de clients lourds avec SmartClient JOnAS Day 5.1...
Agenda <ul><li>Modèle de développement avec Java EE 5 </li><ul><li>Cycle de vie
Injection de dépendances
Persistance
Modèle EJB3 </li></ul><li>Clients lourds : lancement simplifié avec JOnAS 5 </li></ul>
Cycle de vie
Cycle de vie : Introduction <ul><li>Avec Java EE 5, il est facile d'effectuer des actions lors de différentes phases du cy...
Avant sa destruction : @PreDestroy </li></ul><li>Aucune interface obligatoire à implémenter pour ajouter des intercepteurs...
Évite d'avoir des « méthodes vides » car requises par l'interface </li></ul><li>On peut garder le nom des méthodes </li></...
Cycle de vie : Fichier XML <ul><li>Les intercepteurs de cycle de vie sont définis via des annotations.
Ils peuvent également être spécifiés avec les fichiers XML </li></ul><?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&qu...
Injection de dépendances
Injection de dépendances : Principe <ul><li>Facilite la composition de composants </li><ul><li>On peut choisir l'objet qui...
Simplification du code : </li><ul><li>On supprime tout le code lié à la récupération d'instances d'objets </li></ul></ul>@...
<ul><li>Récupération d'une connexion vers une BDD </li><ul><li>Avec J2EE 1.4, l e composant doit récupérer seul sa ressour...
<ul><li>Avec J2EE 1.4 : </li></ul><ul><li>Avec l'injection de dépendance / Java EE 5: </li></ul>Context ictx = new Initial...
<ul><li>L'injection de dépendances peut être réalisée avec l'aide de descripteurs de déploiement XML
Exemple d'injection de « env-entry » </li></ul>Injection de dépendances : Sans annotations <env-entry> <env-entry-name>mon...
Persistance
Persistance : JPA, un nouveau modèle <ul><li>Une des critiques sur les « EJB » était liée à son modèle de persistance.
Avec Java EE 5, il y a un nouveau modèle de persistance :  J ava  P ersistence   A pi
Succède aux beans EJB 2.1 CMP1 et CMP2 </li><ul><ul><li>Les Entités JPA ne sont plus des EJBs </li></ul><li>Utilisation de...
De concept proche de Hibernate/JDO </li><ul><li>Modèle  P lain  O ld  J ava  O bject </li></ul></ul></ul>
Persistance : Gestion des objets <ul><li>Pour accéder aux entités JPA, on passe par un gestionnaire de persistance nommé E...
Un EntityManager est injectable comme d'autres ressources Java EE </li></ul>@PersistenceContext private EntityManager enti...
Persistance : Aperçu du modèle <ul><li>Les entités JPA sont des POJOs </li><ul><li>Création avec le constructeur « new » <...
Les requêtes JPA-QL sont exécutées en utilisant l'objet EntityManager </li></ul>MonEntity entity = new MonEntity(); entity...
Persistance : Métadonnées Entity @Entity @Table(name=”EMPLOYEES”) @Id public class Employee { private int id; private Stri...
Persistance : Les relations <ul><li>Les objets entités JPA peuvent être liés via des relations.
Prenons l'exemple de deux objets/classes : Livre et Auteur
Nous voyons qu'il peut y avoir une relation entre un livre et un auteur. </li><ul><li>-> Un livre est écrit par un ou plus...
@ManyToOne
@OneToMany
Prochain SlideShare
Chargement dans…5
×

#5 Java EE5 Client Lourd et Smart Client

2 546 vues

Publié le

Attribution: Florent Benoit

Publié dans : Technologie
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
2 546
Sur SlideShare
0
Issues des intégrations
0
Intégrations
8
Actions
Partages
0
Téléchargements
0
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

#5 Java EE5 Client Lourd et Smart Client

  1. 1. Simplicité de développement avec Java EE 5 et simplification du lancement de clients lourds avec SmartClient JOnAS Day 5.1 [email_address]
  2. 2. Agenda <ul><li>Modèle de développement avec Java EE 5 </li><ul><li>Cycle de vie
  3. 3. Injection de dépendances
  4. 4. Persistance
  5. 5. Modèle EJB3 </li></ul><li>Clients lourds : lancement simplifié avec JOnAS 5 </li></ul>
  6. 6. Cycle de vie
  7. 7. Cycle de vie : Introduction <ul><li>Avec Java EE 5, il est facile d'effectuer des actions lors de différentes phases du cycle de vie d'un composant. </li><ul><li>Après la création de l'instance : @PostConstruct
  8. 8. Avant sa destruction : @PreDestroy </li></ul><li>Aucune interface obligatoire à implémenter pour ajouter des intercepteurs de cycle de vie : </li><ul><li>Avantage : On supprime le code inutile </li><ul><li>On a du code uniquement pour la phase du cycle de vie souhaitée
  9. 9. Évite d'avoir des « méthodes vides » car requises par l'interface </li></ul><li>On peut garder le nom des méthodes </li></ul></ul>
  10. 10. Cycle de vie : Fichier XML <ul><li>Les intercepteurs de cycle de vie sont définis via des annotations.
  11. 11. Ils peuvent également être spécifiés avec les fichiers XML </li></ul><?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> <ejb-jar xmlns=&quot; http://java.sun.com/xml/ns/javaee &quot; ... version=&quot;3.0&quot;> <enterprise-beans> <session> <ejb-name>MonBean</ejb-name> <ejb-class>monpackage.MonBean</ejb-class> <post-construct> <lifecycle-callback-class>monpackage.MonBean</lifecycle-callback-class> <lifecycle-callback-method> maMethodePostConstruct </lifecycle-callback-method> </post-construct> </session> ...
  12. 12. Injection de dépendances
  13. 13. Injection de dépendances : Principe <ul><li>Facilite la composition de composants </li><ul><li>On peut choisir l'objet qui implémente une interface donnée </li><ul><li>Dans l'exemple suivant, on ne sait pas quelle implémentation sera utilisée, on sait uniquement qu'elle répondra à l'interface demandée </li></ul></ul><li>IoC : Inversion de contrôle
  14. 14. Simplification du code : </li><ul><li>On supprime tout le code lié à la récupération d'instances d'objets </li></ul></ul>@EJB private MonInterface ejb;
  15. 15. <ul><li>Récupération d'une connexion vers une BDD </li><ul><li>Avec J2EE 1.4, l e composant doit récupérer seul sa ressource </li></ul></ul>Injection de dépendances : Accès Ressources Context ictx = new InitialContext(); DataSource myDS = null; try { myDS = (DataSource) ictx.lookup(“java:comp/env/jdbc/myDS”); } catch (NamingException e) { ... } Connection connection = myDS.getConnection(); @Resource(name = &quot;jdbc/myDS&quot;,....) private DataSource myDS; private void method() { Connection connection = myDS.getConnection(); } <ul><ul><li>Avec l'injection de dépendances / Java EE 5, l e conteneur injecte la référence </li></ul></ul>Demande d'injection
  16. 16. <ul><li>Avec J2EE 1.4 : </li></ul><ul><li>Avec l'injection de dépendance / Java EE 5: </li></ul>Context ictx = new InitialContext(); EJBHome ejbHome = null; try { Object o = ictx.lookup(“java:comp/env/ejb/myEJB”); ejbHome = (EJBHome) PortableRemoteObject.narrow(o, EJBHome.class); } catch (NamingException e) { ... } InterfaceEJB ejb = ejbHome.create(); ejb.helloWorld(); @EJB private InterfaceEJB ejb; private void methode() { ejb.helloWorld(); } Injection de dépendances : Accès à un EJB Demande d'injection Plus d'interface Home, l'interface métier est appellée directement
  17. 17. <ul><li>L'injection de dépendances peut être réalisée avec l'aide de descripteurs de déploiement XML
  18. 18. Exemple d'injection de « env-entry » </li></ul>Injection de dépendances : Sans annotations <env-entry> <env-entry-name>monEntree</env-entry-name> <env-entry-type>java.lang.Integer</env-entry-type> <env-entry-value>50</env-entry-value> <injection-target> <injection-target-class>mon.package.MonBean</injection-target-class> <injection-target-name>monEntier</injection-target-name> </injection-target> </env-entry> ... private Integer monEntier; ... Aucune annotation dans le code Valeur 50 injectée
  19. 19. Persistance
  20. 20. Persistance : JPA, un nouveau modèle <ul><li>Une des critiques sur les « EJB » était liée à son modèle de persistance.
  21. 21. Avec Java EE 5, il y a un nouveau modèle de persistance : J ava P ersistence A pi
  22. 22. Succède aux beans EJB 2.1 CMP1 et CMP2 </li><ul><ul><li>Les Entités JPA ne sont plus des EJBs </li></ul><li>Utilisation des annotations : (Approche XDoclet)
  23. 23. De concept proche de Hibernate/JDO </li><ul><li>Modèle P lain O ld J ava O bject </li></ul></ul></ul>
  24. 24. Persistance : Gestion des objets <ul><li>Pour accéder aux entités JPA, on passe par un gestionnaire de persistance nommé EntityManager.
  25. 25. Un EntityManager est injectable comme d'autres ressources Java EE </li></ul>@PersistenceContext private EntityManager entityManager Injection d'un gestionnaire de persistance
  26. 26. Persistance : Aperçu du modèle <ul><li>Les entités JPA sont des POJOs </li><ul><li>Création avec le constructeur « new » </li></ul><li>La gestion de l'objet entité se fait via l'EntityManager
  27. 27. Les requêtes JPA-QL sont exécutées en utilisant l'objet EntityManager </li></ul>MonEntity entity = new MonEntity(); entityManager.persist(entity); Query query = entityManager.createNamedQuery(“select b FROM Book b); List<Book> books = query.getResultList();
  28. 28. Persistance : Métadonnées Entity @Entity @Table(name=”EMPLOYEES”) @Id public class Employee { private int id; private String name; public int getId() { return id; } public void setId(final int id) { this.id = id; } public void setName(final String name) { this.name = name; } public String getName() { return name; } } Clef primaire
  29. 29. Persistance : Les relations <ul><li>Les objets entités JPA peuvent être liés via des relations.
  30. 30. Prenons l'exemple de deux objets/classes : Livre et Auteur
  31. 31. Nous voyons qu'il peut y avoir une relation entre un livre et un auteur. </li><ul><li>-> Un livre est écrit par un ou plusieurs auteurs. </li></ul><li>Pour décrire ces relations, il y a des annotations JPA </li><ul><li>@OneToOne
  32. 32. @ManyToOne
  33. 33. @OneToMany
  34. 34. @ManyToMany </li></ul></ul>
  35. 35. Persistance : Description des informations <ul><li>Les informations liées à la persistance sont stockées dans un fichier nommé « persistence.xml »
  36. 36. Ce fichier contient : </li><ul><li>Les noms des DataSources à utiliser (JTA ou non JTA)
  37. 37. Le fournisseur de persistance : Hibernate Entity Manager, EclipseLink, etc. </li></ul><li>Les paramètres spécifiques pour chaque fournisseur de persistance </li><ul><li>Dialecte avec la base de données
  38. 38. Création ou non des tables/Suppression des données, etc. </li></ul><li>JOnAS fournit deux implémentations de JPA 1.0 </li><ul><li>Hibernate
  39. 39. EclipseLink </li></ul></ul>Choix dans le fichier JONAS_BASE/conf/jonas.properties
  40. 40. EJB3
  41. 41. EJB2 vs EJB3 : Simplicité du développement <ul><li>Les descripteurs de déploiement deviennent optionnels. </li><ul><li>Utilisation des annotations (métadonnées) </li></ul><li>Simplification de la persistance. </li><ul><li>CMP des EJB 2.0 remplacée par JPA (proche du modèle Hibernate/JDO) </li></ul><li>Un ensemble de valeurs par défaut (TX par défaut Required)
  42. 42. Réduction de l'utilisation de certaines exceptions </li><ul><li>exemple : RemoteException </li></ul><li>Interface Home (pour le cycle de vie) n'est plus requise
  43. 43. Les interfaces « callback » ne sont plus obligatoires. Plus besoin d'implémenter javax.ejb.SessionBean
  44. 44. Autorisation de l'héritage
  45. 45. Amélioration du langage EJB-QL : requêtes SQL natives </li></ul>
  46. 46. Définition de Beans EJB 3.0 [1/2] Interface Implémentation @Stateless throws RemoteException { @Remote public interface HelloWorld { String hello() ; } public class HelloWorldBean implements HelloWorld { public String hello() { return “Hello World !”; } } @Stateful extends Remote { throws RemoteException;
  47. 47. @MessageDriven Message Driven Bean Définition de Beans EJB 3.0 [2/2] public class MyMDB implements MessageListener { public void onMessage(Message message) { ... } } @MessageDriven(activateConfig={ @ActivationConfigProperty(propertyName=&quot;destinationType&quot;, propertyValue=&quot;javax.jms.Queue&quot;), @ActivationConfigProperty(propertyName=&quot;destination&quot;, propertyValue=&quot;jms/StockQueue&quot;) } )
  48. 48. Transaction Securité @RolesAllowed(“EasyBeans”) @TransactionAttribute(REQUIRES_NEW) Default = REQUIRED Métadonnées EJB 3.0 @Stateless public class MyBean implements MyItf { public void someMethod') { ... } } @Stateless public class MyBean implements MyItf { public void someMethod () {...} }
  49. 49. Intercepteurs <ul><li>Intercepte les appels des méthodes métiers </li><ul><li>Session Beans + Message Driven Beans
  50. 50. Peut traiter les exceptions remontées par les méthodes
  51. 51. Peut changer les valeurs des paramètres et de retour d'une méthode </li></ul><li>Intercepteurs </li><ul><li>Définition en utilisant l'annotation @AroundInvoke
  52. 52. Référencés par l'annotation @Interceptors </li><ul><li>Référence depuis une classe ou une méthode </li></ul><li>Intercepteurs par défaut (définis dans les descripteurs de déploiement)
  53. 53. Possibilité d'exclure certains intercepteurs </li><ul><li>Intercepteurs par défaut
  54. 54. Intercepteurs définis au niveau de la classe </li></ul></ul></ul>Interceptors Client InvocationContext Interceptors Client InvocationContext
  55. 55. InvocationContext Interface InvocationContext @AroundInvoke Intercepteur de traces public interface InvocationContext { Object getTarget(); Method getMethod(); Object[] getParameters(); setParameters(Object[]); Map getContextData(); // partagé par tous les intercepteurs Object proceed() throws Exception; // appel du prochain intercepteur } public Object trace(InvocationContext invocationContext) throws Exception { long tStart = System.currentTimeMillis(); try { return invocationContext.proceed(); } finally { long elapsed = System.currentTimeMillis() - tStart; System.out.println(inv.getMethod() + &quot; took &quot; + elapsed + &quot; ms.&quot;); } 0
  56. 56. Intercepteurs / Notification du cycle de vie <ul><li>Réception de notification lors d'évènements du cycle de vie
  57. 57. Définition dans la classe du bean :
  58. 58. Ou dans une classe séparée :
  59. 59. Même conception que les intercepteurs de méthodes métiers </li></ul>public void myPostConstruct(InvocationContext ctx) { ...} @PostConstruct @PreDestroy public void myPreDestroy() { ...}
  60. 60. EJB / JPA : Annotations de cycle de vie Annotation SLSB SFSB MDB X X X X X X X X Session & Message Driven Beans Entities @PostPersist @PreRemove @PostRemove @PreUpdate @PostUpdate @PostLoad @PrePassivate (ejbPassivate) @PostActivate (ejbActivate) @PostConstruct (ejbCreate) @PreDestroy (ejbRemove)
  61. 61. Migration EJB 2.x / EJB 3.0 <ul><li>Objectif : Migrer une application EJB 2.x vers les standards EJB 3.0 en douceur.
  62. 62. Contrainte : Autoriser les anciens clients EJB 2.X </li><ul><li>Client EJB 2.X = Utilisation du Home et de l'opération create() pour obtention d'un bean </li></ul></ul>
  63. 63. Définition des interfaces public interface EJB2RemoteHome extends EJBHome { EJB2RemoteInterface create() throws CreateException, RemoteException; } public interface EJB2RemoteInterface extends EJBObject { void hello21Remote() throws RemoteException; } <ul><li>Définition de l'interface « Home » : </li></ul><ul><li>Définition de l'interface EJB 2.X « Métier » : </li></ul><ul><li>Définition de l'interface EJB 3.X « Métier » : </li></ul>public interface EJB3RemoteBusinessInterface { void hello(); }
  64. 64. EJB 3.0 : Création de l'EJB @Stateless @RemoteHome (EJB2RemoteHome. class ) @Remote (EJB3RemoteBusinessInterface. class ) public class EJB2And3Bean implements EJB3RemoteBusinessInterface { /** * Hello world (Interface EJB 3). */ public void hello() { System. out .println( &quot;Hello world EJB 3.0 !&quot; ); } /** * Hello World (Interface EJB 2.1 remote). */ public void hello21Remote() { System. out .println( &quot;Hello world EJB 2.1 Remote!&quot; ); } } <ul><li>Bean EJB 2.x et EJB 3.0 </li></ul>
  65. 65. Sécurité : Les annotations <ul><li>Avec Java EE 5, la sécurité est désormais configurable à l'aide d'annotations : </li><ul><li>Package javax.annotation.security </li><ul><li>@DeclareRoles(String[])
  66. 66. @DenyAll
  67. 67. @PermitAll
  68. 68. @RolesAllowed(String[])
  69. 69. @RunAs(String) </li></ul></ul></ul>
  70. 70. Agenda <ul><li>Modèle de développement avec Java EE 5 </li><ul><li>Cycle de vie
  71. 71. Injection de dépendances
  72. 72. Persistance
  73. 73. Modèle EJB3 </li></ul><li>Clients lourds : lancement simplifié avec JOnAS 5 </li></ul>
  74. 74. SmartClient : Lancement facile de clients <ul><li>Problématique : </li><ul><li>Quels jars faut il ajouter côté client pour le lancement de mon client ? </li><ul><li>Client.jar : pratique car il contient tout mais souvent trop « gros » </li></ul></ul><li>La réponse : smart client (JONAS_ROOT/lib/smartclient.jar) </li><ul><li>L'avantage est que ce jar pèse 30ko </li><ul><li>Uniquement les classes requises pour le lancement du client sont téléchargées (en moyenne ~ 100 classes) </li></ul><li>Utilisable en changeant la classe JNDI factory </li><ul><li>Hashtable<String, Object> env = new Hashtable<String, Object>(); env.put(Context.INITIAL_CONTEXT_FACTORY,' org.ow2.easybeans.component.smartclient.spi.SmartContextFactory' ); InitialContext context = new InitialContext(env);
  75. 75. Provider URL = smart://localhost:2503 par défaut </li><ul><li>Port configurable dans JONAS_BASE/conf/jonas.properties </li></ul></ul></ul></ul>

×