Spring 2.0 und EJB 3 Vergleich und Integrationsmöglichkeiten Stefan Scheidt OPITZ CONSULTING GmbH Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 1 Agenda ● Vorstellung Spring und EJB Was ist Spring? Was ist EJB? Historie ● Vergleich Dependency Injection, Persistenz, Transaktionsmanagement, Sicherheit, Aspektorientierte Programmierung, Stateful Business Logic, Asynchrone Verarbeitung, Remoting, Deployment ● Integrationsmöglichkeiten Nutzung von JPA, EJB als Fassade für Spring, Spring als EJB Client, Dependency Injection von Spring Beans in EJBs, Projekt Pitchfork Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 2 - Spring und EJB Kurzvorstellung Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 3 Was ist Spring? ● Das Spring Framework ist ein mehrschichtiges Java EE Applikationsframework ● Primäre Ziele: ● Der Einsatz von Java EE soll vereinfacht werden ● OO-Designprinzipien sollen leichter anwendbar sein ● Die einzelnen Bestandteile einer Applikation sollen möglichst leicht in Isolation getestet werden können ● Praxiserprobte Lösungen für bestimmte Aufgabenstellungen sollen leicht integrierbar sein – „It‘s all about choice!“ ● Der Anwendungscode soll möglichst nicht von Spring abhängen siehe http://www.springframework.org/about Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 4 Historie Spring Sep 04: Spring 1.1 Juli 04: J2EE without EJB Mai 06: EJB 3.0 März 04: Spring 1.0 Feb 03: Gründung Open-Source-Projekt Nov 02: J2EE Design and Development 2003 2004 Okt 06: Spring 2.0 Mai 05: Spring 1.2 2005 Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten 2006 2007 Seite 5 Typeisch Architektur Spring-basierter Enterprise-Anwendungen Remote Exporter Präsentationsschicht Transaktionsgrenzen Service Interface + Asynchrone Verarbeitung + Sicherheitsaspekte Service Implementierung Domänen Objekte DAO Interface DAO Implementierung Container EIS Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 6 Was ist EJB 3.0 ● EJB ist eine (Server-seitige) Komponentenarchitektur für Java EE. Sie vereinfacht die Entwicklung verteilter und transaktionaler Applikationen auf Basis von Java. ● Primäre Ziele von EJB 3: ● Vereinfachung des Programmiermodells im Vergleich zu EJB 2 ● Einführung eines POJO-basierten Programmiermodells ● Konfiguration durch die Verwendung von Annotationen ● Einfachere Konfiguration durch „Configuration by Exception“ ● Persistenz durch objektrelationales Mapping Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 7 Historie EJB Okt 06: Spring 2.0 März 04: Spring 1.0 Mai 06: EJB 3.0 Nov 03: EJB 2.1 Aug 01: EJB 2.0 Nov 99: EJB 1.1 1999 2000 2001 2002 2003 Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten 2004 2005 2006 2007 Seite 8 - Spring und EJB Vergleich Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 9 Vergleichskriterien ● ● ● ● ● ● ● ● ● ● Grundsätzliches Dependency Injection Persistenz Transaktionsmanagement Sicherheit Aspektorientierte Programmierung Stateful Business Logic Asynchrone Verarbeitung Remoting Deployment Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 10 Vergleich: Grundsätzliches ● Voraussetzungen für den Einsatz von Spring: ● Java SE, JDK ab Version 1.3 ● Dadurch nutzbar in Stand-Alone- oder Client/Server-Umgebungen ● Servlet Containern (Tomcat) ● Java EE Application Servern ● Verwendet man JDK 1.5, so werden die neuen Sprachfeatures unterstützt ● ● Voraussetzungen für den Einsatz von EJB 3: ● Java SE, JDK ab Version 1.5 ● EJB-3-Container, aufbauend auf JNDI, JTA, JMS etc. Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 11 Vergleichskriterien ● ● ● ● ● ● ● ● ● ● Grundsätzliches Dependency Injection Persistenz Transaktionsmanagement Sicherheit Aspektorientierte Programmierung Stateful Business Logic Asynchrone Verarbeitung Remoting Deployment Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 12 Vergleich: Dependency Injection ● Merkmale Spring: ● Dependencies werden vom „Application Context“ verwaltet ● Definition in der Regel durch XML-Konfiguration ● Public Setter- und Constructor-Injection ● Nutzbar für beliebige Java Beans ● Instanzen-Verwaltung: singleton, prototype, custom scope (z.B. request, session) ● Merkmale EJB: ● Dependencies werden vom EJB-Container mit JNDI verwaltet ● Definition durch Annotationen, alternativ/überschreibend mit XML ● Field- und Setter-Injection ● Nutzbar nur für spezielle Java-EE-Typen ● Instanzen-Verwaltung: Stateless, Stateful Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 13 Vergleichskriterien ● ● ● ● ● ● ● ● ● ● Grundsätzliches Dependency Injection Persistenz Transaktionsmanagement Sicherheit Aspektorientierte Programmierung Stateful Business Logic Asynchrone Verarbeitung Remoting Deployment Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 14 Vergleich: Persistenz ● Merkmale Spring: ● Unterstützung für diverse Persistenz-Frameworks, u.a. ● ● ● ● JPA, JDO, Hibernate, TopLink, iBATIS, JDBC Integration von Data Sources und Transaktionsmanagement Übersetzung von Exceptions des Persistenz-Frameworks in Spring Data Access Exceptions (optional) Einfachere Programmierung durch Template-Klassen (optional) Basisklassen für die Implementierung von DAOs (optional) ● Merkmale EJB: ● Unterstützung für „plain JDBC“ und JPA ● Transparente Integration von JPA Entity Manager bzw. Entity Manager Factory ● Unterstützung für Stateful Session Beans durch Extended Persistence Context Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 15 Vergleichskriterien ● ● ● ● ● ● ● ● ● ● Grundsätzliches Dependency Injection Persistenz Transaktionsmanagement Sicherheit Aspektorientierte Programmierung Stateful Business Logic Asynchrone Verarbeitung Remoting Deployment Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 16 Vergleich: Transaktionsmanagement ● Merkmale Spring: ● Unterstützung für diverse Tx-APIs, u.a. JDBC-basierte APIs (Hibernate, TopLink, JPA), JDO, JTA ● Abstraktion und Austauschbarkeit durch Interface PlattformTransactionManager und Transaction Exceptions ● Programmatisches und deklaratives Tx-Management ● Deklaration mittels XML-Konfiguration oder Annotationen, inkl. Roleback Rules ● Merkmale EJB: ● Tx-Management ausschließlich mittels JTA ● Programmatisches und deklaratives Tx-Management ● Deklaration mittels Annotationen, alternativ/überschreibend mit XML, Roleback Rules durch @ApplicationException Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 17 Vergleichskriterien ● ● ● ● ● ● ● ● ● ● Grundsätzliches Dependency Injection Persistenz Transaktionsmanagement Sicherheit Aspektorientierte Programmierung Stateful Business Logic Asynchrone Verarbeitung Remoting Deployment Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 18 Vergleich: Sicherheit ● Merkmale Spring: ● Security in Spring durch das Acegi Security System (zukünftig „Spring Security“). ● Sicherheit für Spring Beans durch Method Security Interceptors, erlauben auch Domain Object Instance Security durch ACLs. ● Konfiguration im Spring Application Context und optional durch Security Annotations ● Extrem flexibel konfigurieren durch konsequente Nutzung von DI ● Merkmale EJB: ● Unterstützung für Authentifizierung und Autorisierung ● Definition programmatisch oder deklarativ ● Deklaration durch Security Annotations, alternativ in XML Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 19 Vergleichskriterien ● ● ● ● ● ● ● ● ● ● Grundsätzliches Dependency Injection Persistenz Transaktionsmanagement Sicherheit Aspektorientierte Programmierung Stateful Business Logic Asynchrone Verarbeitung Remoting Deployment Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 20 Vergleich: Aspektorientierte Programmierung ● Merkmale Spring: ● Proxy-Basiert ● Einfaches Joinpoint-Modell: Public Methods von Spring Beans ● Mächtige AspectJ Pointcut Language ● Transparente Integration von AspectJ möglich ● Merkmale EJB: ● Realisierung der Aspekte ausschließlich durch Interceptors ● durch @Interceptor auf Methoden-Ebene duch @Interceptors auf Klassenebene ● Nur für spezielle Typen (EJB-Container-verwaltete Beans) ● Keine Pointcut-Language Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 21 Vergleichskriterien ● ● ● ● ● ● ● ● ● ● Grundsätzliches Dependency Injection Persistenz Transaktionsmanagement Sicherheit Aspektorientierte Programmierung Stateful Business Logic Asynchrone Verarbeitung Remoting Deployment Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 22 Stateful Business Logic ● Merkmale Spring: ● Spring bietet kein Zustandsmanagement für Service-Objekte ● Ein Scope-Konzept existiert für Spring Beans z.B. innerhalb von Web-Applikationen ● Merkmale EJB: ● Zentrales Paradigma innerhalb der Java EE ● @Stateful macht eine Klasse zu einer durch den EJB-Container gemanagten Ressource, die einer dedizierten Client-Sitzung zugeordnet wird, und erlaubt so Konversationen Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 23 Vergleichskriterien ● ● ● ● ● ● ● ● ● ● Grundsätzliches Dependency Injection Persistenz Transaktionsmanagement Sicherheit Aspektorientierte Programmierung Stateful Business Logic Asynchrone Verarbeitung Remoting Deployment Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 24 Asynchrone Verarbeitung ● Merkmale Spring: ● Vereinfachtes Programmiermodell, um Versand und Empfang von JMS-basierten Nachrichten durchzuführen (JmsTemplate). ● Für den Empfang asynchroner Nachrichten werden Message Driven POJOs (MDP) eingesetzt. Diese implementieren das Interface javax.jms.MessageListener. ● Für das Management des Transports und der Benachrichtigung muss die Laufzeitumgebung eine JMS-Implementierung bereitstellen ● Merkmale EJB: ● Message Driven Beans (MDB) sind grundlegender Bestandteil der Java EE und erlauben die Verarbeitung asynchron empfangener Nachrichten. ● Das Management des Transports und der Benachrichtigung übernimmt der EJB-Container. Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 25 Vergleichskriterien ● ● ● ● ● ● ● ● ● ● Grundsätzliches Dependency Injection Persistenz Transaktionsmanagement Sicherheit Aspektorientierte Programmierung Stateful Business Logic Asynchrone Verarbeitung Remoting Deployment Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 26 Remoting (1) ● Merkmale Spring: ● Spring bietet durch „Remote Exporter“ und „Local Proxies“ ein einfach Programmiermodell,um eine Remote-Kommunikation zu realisieren ● „Zwischen“ serverseitigen Exportern und clientseitigen Proxies können verschiedene Protokolle eingesetzt werden: HTTP, Burlap/Hessian, RMI, Web Services ● Merkmale EJB: ● Mit @Remote annotierte Klassen stehen über RMI/IIOP als Remote-Komponente zur Verfügung. ● Mit @WebService annotierte Klassen exportieren Geschäftslogik wahlweise über JAX-WS 2.0 oder SOAP 1.2 via JAX-RPC API ● Remote-Komponenten können an verteilten Transaktionen partizipieren. Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 27 Vergleichskriterien ● ● ● ● ● ● ● ● ● ● Grundsätzliches Dependency Injection Persistenz Transaktionsmanagement Sicherheit Aspektorientierte Programmierung Stateful Business Logic Asynchrone Verarbeitung Remoting Deployment Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 28 Vergleich: Deployment ● Merkmale Spring: ● Sammlung aller relevanten JARs z.B. in WEB-INF/lib ● Konfiguration (meist) durch XML-Konfigurationsdatei(en) ● Keine Java-EE-spezifischen Deployment-Deskriptoren ● Merkmale EJB: ● EJB-JAR in EAR ● Konfiguration durch Annotationen und ggf. EJB-Deployment-Deskriptor ● Ggf. Container-spezifische Deployment-Deskriptoren ● EJB-Container (bzw. dessen Konfiguration) legt Provider für Diensten fest, z.B. für JPA oder JTA Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 29 - Spring 2.0 und EJB Vergleich: Fazit Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 30 Fazit zum Vergleich ● Spring liefert nicht-invasive Unterstützung in Form eines Infrastruktur-Frameworks EJB 3 bindet an einen EJB-3-Container ● Spring liefert in vielen Bereichen im Detail mehr Funktionen EJB 3 ist für einfache Anwendungsfälle leichter zu handhaben, läßt aber die Spring Programmiervereifachungen vermissen ● Spring bietet vollwertige Unterstützung für AOP EJB 3 bietet vollwertige Unterstützung für zustandsbehaftete und verteilte Komponenten Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 31 Bitte nicht vergessen… – Integration – ● JMX ● JCA CCI – Präsentation – ● Web MVC Action-Basiertes Webframework Support für JSP, Velocity, FreeMarker, XSLT, PDF, Excel, JasperReports DAO-Support durch CciTemplate ● E-Mail ● Scheduling ● Integration anderer WebFrameworks Quartz Scheduler, JDK Timer, TaskExecutor ● Dynamic Languages Groovy, BeanShell, JRuby ● ● ● ● ● JavaServer Faces, Struts, Tapestry, WebWork ● Portlet MVC MVC-basiertes Portlet-Framework – Subprojekte – Acegi Security ● Extentions Web Flow ● IDE for Eclipse Web Services ● BeanDoc LDAP ● OSGi Rich Client ● .NET Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 32 - Spring 2.0 und EJB Integrationsmöglichkeiten Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 33 Motivation ● Warum ist eine Integration überhaupt wünschenswert? Folgende Szenarien sind denkbar: ● Man möchte als Persistenzframework den neue JPA-Standard verwenden ● Mittelschichtkomponenten wurden mit Spring entwickelt und müssen als EJBs „exportiert“ werden ● Die Präsentationsschicht wird mit Hilfe von Spring entwickelt und muss auf EJBs zugreifen ● Man möchte mit EJB 3 entwickeln, aber die Spring Programmiervereinfachungen nutzen ● Für die Implementierung „hinter“ einer EJB möchte man Spring nutzen Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 34 - Spring und EJB Integration Teil 1: JPA Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 35 Einschub: Wo wird JPA eingesetzt? Remote Exporter Präsentationsschicht Transaktionsgrenzen Service Interface Service Implementierung Domänen Objekte DAO Interface DAO Implementierung DI-Container Datenbank Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 36 Einschub: Objektrelationales Mapping ● O/R Mapping: „Abbildung von Klassen auf Tabellen“ ● Domänen-Objekte auf Datensätze ● Attribute auf Spalten ● Assoziationen auf FK-Referenzen ● Vererbungshierarchien auf eine oder mehrere Tabellen ● Objektidentität verwalten ● Optimistic Locking / Versionierung Mapping-Metadaten ● Persistenz-Manager: Schnittstelle für CRUD-Operationen ● CRUD: Create, Read, Update, Delete ● API oder objektorientierte Abfragesprache zur Formulierung und Durchführung von Abfragen Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 37 Einschub: Historie von JPA Eigenentwicklungen 2006: JPA als Teil von EJB 3.0 2001: JDO 1999: EJB 1.1 Entity Beans 1997: CocoBase 2003: JSR 220 – EJB 3.0 2001: Hibernate 1997: TopLink for Java 1998 2000 2002 Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten 2004 2006 Seite 38 Einschub: JPA – die Java Persistence API ● ● ● ● ● Bestandteil der JSR-220: Enterprise Java Beans 3.0 Nachfolger der EJB Entity Beans Weiterentwicklung unabhängig von EJB-Standard POJO-basiertes Domain Model Vereint die besten Ideen und Patterns aus ● Hibernate ● Toplink ● JDO ● Einsatzumgebungen ● In JEE5-Container: Container-Managed Persistence ● Standalone in JSE-Anwendungen ● Spring 2.0 emuliert Container-Verhalten für Einsatz in beliebigen JSE/JEE-Anwendungen Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 39 Einschub: Abbildung von Java-Klassen auf RDBMS-Tabellen MappingMetadaten Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 40 Einschub: Mapping-Metadaten mit Java 5 Annotationen – Einfach Objektidentität Optimistic Locking 1-n Assoziation n-1 einfaches Attribut Zeitattribut Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 41 Mapping-Metadaten mit Java 5 Annotationen – Ausführlich Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 42 Bestandteile der Spring JPA-Unterstützung ● Unterstützung analog zu anderen Persistenz-Frameworks (u.a. Hibernate, TopLink, JDO, iBATIS, JDBC) ● Integration von Data-Source- und Transaktionsmanagement ● Unterstützung bei JPA-Ressourcen-Management ● Optional: Übersetzung von JPA-Exceptions in Springs Data-Access-Exceptions ● Optional: Programmiervereinfachung mit Template-Klassen ● Optional: Basisklassen für die Implementierung von DAOs Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 43 Einschub: Entity Manager und Persistence Context „Lebensraum“ der persistenten Entitäten zur Laufzeit JPA-DAOs Persistence Persistence Context Context cd Logica l Vie w DAO Entity Implementierun gManager Orde r 1 Cus tomer 1 RDBMS Order 2 Orde r 3 Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Synchronisation Custome r 2 Seite 44 Einschub: Entity Manager ● Definiert die Operationen für die Interaktion zwischen DAOs und Persistence Context ● Modus 1: Container-Managed ● Erzeugung, Transaktionssteuerung und Schließen werden vom Container übernommen ● Modus 2: Application-Managed ● Steuerung erfolgt manuell im Applikationscode ● Interface für den typischen CRUD-Workflow ● persist() ● find(), createQuery() ● merge() ● remove() ≈ CREATE ≈ READ ≈ UPDATE ≈ DELETE Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 45 Konfiguration der Entity Manager Factory Konfiguration der Entity Manager Factory in Spring: ● Lösungsansatz 1: ● ● Vollständig Konfiguration einer Persistence Unit (PU) in der Datei META-INF/persistence.xml Springs LocalEntityManagerFactoryBean nutzt diese Informationen und kann die PU z.B. in Datenzugriffsobjekte injizieren ● Lösungsansatz 2: ● ● ● Springs LocalContainerEntityManagerFactoryBean gestattet volle Kontrolle über das Bootstrapping der Persistence Unit. In Spring bereits deklarierte Data Sources können dabei verwendet werden Byte-Code-Instrumentierung für many-to-one oder one-to-one Lazy-Loading kann auf Classloader-Ebene geschehen Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 46 Transaktionsunterstützung ● Spring unterstützt zwei verschiedene Transaktions-Strategien für JPA ● Eine Bean vom Typ JpaTransactionManager in Kombination mit transaction-type="RESSOURCE_LOCAL" in persistence.xml steuert Transaktionen auf der Basis des JDBC-Treibers („lokale Tx“) ● Eine Bean vom Typ JtaTransactionManager in Kombination mit transaction-type="JTA" in persistence.xml ermöglicht die Teilnahme an XA-Transaktionen („globale Tx“) Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 47 Verwendung des Entity Managers in Spring (1) ● Es stehen unterschiedliche Strategien für die Verwaltung von Entity Manager Factory und Entity Manager zur Verfügung ● „Plain-JPA-Programmiermodell“ Container-Managed ● Application-Managed ● „Spring-Template-Programmiermodell ● Mit und ohne Ableiten aus Springs JpaDaoSupport ● ● Mischformen sind möglich, aber nur bei speziellen Anforderungen sinnvoll Quelle: http://static.springframework.org/spring/docs/2.0.x/reference/orm.html#orm-jpa Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 48 Verwendung des Entity Managers in Spring (2) Plain-JPA-Programmiermodel Container-Managed, inkl. Exception Translation Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 49 Verwendung des Entity Managers in Spring (3) Spring-Template-Programmiermodell inkl. Verwendung von JpaDaoSupport Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 50 - Spring und EJB Integration Teil 2: Sonstiges Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 51 Motivation ● Warum ist eine Integration überhaupt wünschenswert? Folgende Szenarien sind denkbar: ● Man möchte als Persistenzframework den neue JPA-Standard verwenden ● Mittelschichtkomponenten wurden mit Spring entwickelt und müssen als EJBs „exportiert“ werden ● Die Präsentationsschicht wird mit Hilfe von Spring entwickelt und muss auf EJBs zugreifen ● Man möchte mit EJB 3 entwickeln, aber die Spring Programmiervereinfachungen nutzen ● Für die Implementierung „hinter“ einer EJB möchte man Spring nutzen Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 52 Integration: EJBs als Fassade für Spring Beans (1) ● EJB als Fassade für Spring Beans: ● Idee: Implementierung eines Business Service als Spring Bean Bereitstellung des Service als EJB ● Das Problem: Bereitstellen des Application Context für die Fassaden-Bean ● Grundlegender Support dafür in Spring: ContextXxxBeanFactoryLocator „Defines a contract for the lookup, use, and release of a BeanFactory, or BeanFactory subclass such as ApplicationContext.” Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 53 Integration: EJBs als Fassade für Spring Beans (2) ● EJB als Fassade für Spring Beans: ● Für EJB 2: Spring-Basisklasse AbstractEnterpriseBean für Entwicklung von EJB 2.1 Enterprise Beans, vererbt Methode getBeanFactory für Zugriff auf Spring Beans Quelle: http://www.javaworld.com/javaworld/jw-02-2005/jw-0214-springejb.html ● Für EJB 3: (Noch?) Keine Basisklassen Adaption der Vorgehensweise für EJB 2.1 ist relativ einfach Aber will man dass? Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 54 Integration: EJBs als Fassade für Spring Beans (3) class ej b «interface» ej b::SessionBean spring:: AbstractStatelessSessionBean + «interface» service::EmployeeService getBeanFactory(String) : Object SessionFacadeEJB Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten serv ice::EmployeeServ iceImpl Seite 55 Integration: EJBs als Fassade für Spring Beans (4) Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 56 Motivation ● Warum ist eine Integration überhaupt wünschenswert? Folgende Szenarien sind denkbar: ● Man möchte als Persistenzframework den neue JPA-Standard verwenden ● Mittelschichtkomponenten wurden mit Spring entwickelt und müssen als EJBs „exportiert“ werden ● Die Präsentationsschicht wird mit Hilfe von Spring entwickelt und muss auf EJBs zugreifen ● Man möchte mit EJB 3 entwickeln, aber die Spring Programmiervereinfachungen nutzen ● Für die Implementierung „hinter“ einer EJB möchte man Spring nutzen Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 57 Integration: Spring als EJB-Client (1) ● Spring als EJB-Client ● Grundlegender Support: JndiObjectLocator „Convenient superclass for JNDI-based service locators.“ ● Für EJB 2.1: XxxStatelessSessionProxyFactoryBean für SLSBs JndiObjectFactoryBean für SFSBs ● Für EJB 3: JndiObjectFactoryBean reicht Aufgrund der Vereinfachungen bei EJB 3 aus. Quellen: ● http://www.javaworld.com/javaworld/jw-02-2005/jw-0214-springejb.html ● http://www.breddy.net/2006/07/06/accessing-a-jboss-ejb3-session-bean-with-spring/ Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 58 Integration: Spring als EJB-Client (2) EJB 2: Deklaration der SLSB Factory Bean im Application Context Spring 1.2: <bean id="employeeService" class="...LocalStatelessSessionProxyFactoryBean"> <property name="jndiName" value="ejb/EmployeeServiceBean"/> <property name="businessInterface" value="...EmployeeService"/> </bean> Spring 2.0 Namespaces: <jee:local-slsb id="employeeService" jndi-name="ejb/EmployeeServiceBean" business-interface="...EmployeeService"/> Anschließend kann die Referenz einfach in einen Client injiziert werden. Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 59 Integration: Spring als EJB-Client (3) EJB 3: Deklaration der JNDI Factory Bean im Application Context Spring 1.2: <bean id="employeeService" class="...JndiObjectProxyFactoryBean"> <property name="jndiName" value="ejb/EmployeeServiceBean"/> <property name="expectedType" value="...EmployeeService"/> </bean> Spring 2.0 Namespaces: <jee:jndi-lookup id="employeeService" jndi-name="ejb/EmployeeServiceBean" expected-type="...EmployeeService"/> Anschließend kann die Referenz einfach in einen Client injiziert werden. Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 60 Motivation ● Warum ist eine Integration überhaupt wünschenswert? Folgende Szenarien sind denkbar: ● Man möchte als Persistenzframework den neue JPA-Standard verwenden ● Mittelschichtkomponenten wurden mit Spring entwickelt und müssen als EJBs „exportiert“ werden ● Die Präsentationsschicht wird mit Hilfe von Spring entwickelt und muss auf EJBs zugreifen ● Man möchte mit EJB 3 entwickeln, aber die Spring Programmiervereinfachungen nutzen ● Für die Implementierung „hinter“ einer EJB möchte man Spring nutzen Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 61 Nutzung von Spring als Klassenbibliothek ● Spring kann häufig auch einfach als Klassenbibliothek genutzt werden: Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 62 Motivation ● Warum ist eine Integration überhaupt wünschenswert? Folgende Szenarien sind denkbar: ● Man möchte als Persistenzframework den neue JPA-Standard verwenden ● Mittelschichtkomponenten wurden mit Spring entwickelt und müssen als EJBs „exportiert“ werden ● Die Präsentationsschicht wird mit Hilfe von Spring entwickelt und muss auf EJBs zugreifen ● Man möchte mit EJB 3 entwickeln, aber die Spring Programmiervereinfachungen nutzen ● Für die Implementierung „hinter“ einer EJB möchte man Spring nutzen Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 63 Integration: DI von Spring Beans in EJBs (1) ● Feingranulare Komposition von EJBs und Spring Beans ● Beispiel: Service als EJB Session Bean, DAOs als Spring Beans Problem: EJB DI erfasst Spring Beans nicht. ● Lösungsansatz 1: Spring Beans im Enterprise Naming Context publizieren und anschließend mit @Resource in EJB injizieren Publizieren im JNDI z.B. durch einen Servlet Context Listener oder Application-Server-spezifische Erweiterungen, z.B. JBoss Spring Deployer Quellen: ● http://chris-richardson.blog-city.com/... the_ejb_cult_part_3__integrating_spring_and_ejb_30_dependency_injection.htm ● http://java.sys-con.com/read/180386.htm Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 64 Integration: DI von Spring Beans in EJBs (2) ● Feingranulare Komposition von EJBs und Spring Beans ● Lösungsansatz 2: EJBs werden im Spring Application Context bekannt gemacht und können dort wie Spring Beans konfiguriert werden. Hierfür werden jedoch entweder Container-spezifische Erweiterungen (siehe z.B. BEA WebLogic Server EJB 3.0 Tech Preview) oder AOP (AspectJ) benötigt, um in den Erzeugungsprozess der EJBs einzugreifen Quellen: ● http://dev2dev.bea.com/pub/a/2005/09/spring_integration_weblogic_server.html ● http://springide.org/project/wiki/JeeWithSpringAndBea ● http://www.jroller.com/page/malbari?entry=javaee_5_spring_2_and ● http://springide.org/project/wiki/SpringDependencyInjectionWithEjb3 Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 65 Integration: DI von Spring Beans in EJBs (3) ● Feingranulare Komposition von EJBs und Spring Beans ● Lösungsansatz 3: Definition einer Annotation @SpringBean zur Deklaration einer Dependency zwischen einer EJB und einer Spring-Bean Definition eines EJB-Interceptors, der auf die Annotation reagiert, mit Hilfe eines Bean Factory Locators den Application Context erzeugt und die Spring Bean injiziert. Quelle: ● http://twasink.net/blog/archives/2007/01/using_spring_wi.html Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 66 Integration: DI von Spring Beans in EJBs (3) Quelle: http://twasink.net/blog/archives/2007/01/using_spring_wi.html Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 67 - Spring und EJB Integration Teil 3: Pitchfork Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 68 Projekt Pitchfork (1) ● Projekt Pitchfork ● Ergänzung zum Spring Framework ● Projektziel: „An add-on for the Spring Framework performing JSR-250 dependency injection, annotation processing and EJB 3.0-style interception, developed by Interface21 and BEA Systems.“ ● Anlass: EJB-3-Support durch BEA WebLogic Server wird mit Hilfe von Spring und Pitchfork implementiert. ● Einsatzszenarien: EJB-3-Funktionen im Tomcat nutzen Testen von EJB-3-Komponenten außerhalb des Containers Quellen: ● http://www.interface21.com/pitchfork ● http://dev2dev.bea.com/pub/a/2005/09/spring_integration_weblogic_server.html Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 69 Projekt Pitchfork (2) ● Durch Pitchfork unterstützte Annotationen: ● JSR 250 injection annotations (javax.annotation): @PostCostruct, @PreDestroy and @Resource ● EJB3 interception annotations (javax.interceptor): @AroundInvoke, @ExcludeClassInterceptors, @ExcludeDefaultInterceptors, @Interceptors, @Invocation ● EJB3 transaction annotations (javax.ejb): @Stateless, @ApplicationException and @TransactionAttribute ● EJB3 injection annotation (javax.ejb): @EJB (Seit Pitchfork Release 1.0-m2) Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 70 & Fragen & Antworten Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 71 Quellen ● Spring Framework: http://www.springframework.org/ ● Rod Johnson, Introduction to the Spring Framework: http://www.theserverside.com/tt/articles/article.tss?l=SpringFramework ● Enterprise JavaBeans Technology: http://java.sun.com/products/ejb/ ● EJB 3.0 Specification Final Release: http://java.sun.com/products/ejb/docs.html ● Java Persistence API: http://java.sun.com/javaee/technologies/entapps/persistence.jsp ● Backschat, Rücker: Enterprise JavaBeans 3.0, Kapitel 13: „Frameworks: Spring und Seam“ http://www.ejbbuch.de/ Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 72 Kontakt: Stefan Scheidt OPITZ CONSULTING GmbH [email protected] Vielen Dank für Ihr Interesse ! Spring 2.0 und EJB 3 – Vergleich und Integrationsmöglichkeiten Seite 73