Programmering

EJB 3.0 i en nøddeskal

På trods af adskillige positive hindringer kompleksiteten af ​​Enterprise JavaBeans-arkitekturen vedtagelsen af ​​J2EE. EJB-arkitekturen er sandsynligvis den eneste J2EE-komponent, der har svigtet så hårdt med at levere J2EEs løfte om øget udviklerproduktivitet grundig nem udvikling. EJB 3.0 gør endnu et forsøg på at levere dette løfte ved at reducere EJB's kompleksitet for udviklere. EJB 3.0 mindsker antallet af programmeringsartefakter, som udviklere kan levere, eliminerer eller minimerer tilbagekaldsmetoder, der skal implementeres, og reducerer kompleksiteten af ​​enhedens bønneprogrammeringsmodel og O / R-kortlægningsmodel.

I denne artikel dækker jeg først de mest betydningsfulde ændringer i EJB 3.0. Det er vigtigt at have det grundlæggende på plads, før du dykker ned i EJB 3.0-poolen. Dernæst giver jeg et højt overblik over EJB 3.0-udkastet og går derefter ind i detaljerne i den foreslåede specifikation, idet jeg er opmærksom på alle ændringer en efter en: indvirkning på typer af virksomhedsbønner, O / R-kortlægningsmodel, enhed- forholdsmodel, EJB QL (EJB Query Language) osv.

Baggrund

De to mest betydningsfulde ændringer i den foreslåede EJB 3.0-specifikation er brugen af ​​programkommenteringsfaciliteten introduceret i Java 5 og den nye O / R-kortlægningsmodel baseret på dvale.

Metadatafacilitet i Java 5

Java 5 (tidligere kaldet J2SE 1.5 eller Tiger) har introduceret en ny programkommenteringsfacilitet til sproget. Med denne facilitet kan du definere brugerdefinerede kommentarer og derefter kommentere felter, metoder, klasser osv. Med disse kommentarer. Annoteringer påvirker ikke programsemantik direkte, men værktøjer (kompileringstid eller runtime) kan inspicere disse kommentarer for at generere yderligere konstruktioner (som en installationsbeskrivelse) eller håndhæve ønsket runtime-opførsel (som en EJB-komponents statefulde natur). Kommentarer kan inspiceres ved hjælp af kildeparsing (f.eks. Kompilatorer eller IDE-værktøjer) eller ved hjælp af de ekstra refleksions-API'er, der er tilføjet i Java 5. Kommentarer kan defineres til kun at være tilgængelige på kildekodeniveau, på det kompilerede klasseniveau eller ved kørselstid . Alle kommentarer, der foreslås i EJB 3.0's tidlige kladde, har en RetentionPolicy af KØRETID. Dette øger klassens hukommelsesaftryk marginalt, men gør containerudbyderens og værktøjsudbyderens levetid meget lettere.

Se ressourcer for yderligere læsning om dette emne.

Dvale

Dvaletilstand er en populær O / R-kortlægningsramme for open source til Java-miljøer, der er beregnet til at beskytte udviklere mod de mest almindelige datapersistensrelaterede programmeringsopgaver. Det har også et specifikt Hibernate Query Language (HQL), hvoraftryk kan ses i den nye EJB QL. Hibernate tilbyder faciliteter til datahentning og opdatering, sammenkobling af forbindelser, transaktionshåndtering, deklarativ enhedsforholdsstyring og deklarative og programmatiske forespørgsler.

Fugleperspektiv

Ændringerne i den foreslåede EJB 3.0-specifikation kan opdeles i to kategorier:

  • En annoteringsbaseret EJB-programmeringsmodel, ud over EJB 2.1-modellen til at definere en applikations adfærd gennem implementeringsbeskrivere og flere grænseflader.
  • Den nye persistensmodel for enhedsbønner. EJB QL har også ændret sig betydeligt.

Der er også adskillige bivirkninger ved disse forslag, som en ny klientprogrammeringsmodel, brug af forretningsgrænseflader og en enheds bønns livscyklus. Bemærk, at EJB 2.1-programmeringsmodellen (med implementeringsbeskrivelser og hjemme- / fjerngrænseflader) stadig er gyldig. Den nye forenklede model erstatter ikke helt EJB 2.1-modellen.

EJB-kommentarer

Et af ekspertgruppens vigtige mål er at reducere antallet af artefakter, som en bønneudbyder skal levere, og gruppen har gjort et ret pænt stykke arbejde med at nå dette mål. I EJB 3.0-verdenen er alle slags virksomhedsbønner retfærdige almindelige gamle Java-objekter (POJO) med passende kommentarer. Kommentarer kan bruges til at definere bønnens forretningsgrænseflade, O / R-kortlægningsoplysninger, ressourcehenvisninger og næsten alt andet, der blev defineret gennem implementeringsbeskrivere eller grænseflader i EJB 2.1. Implementeringsbeskrivelser er ikke længere påkrævet; hjemmegrænsefladen er væk, og du behøver ikke nødvendigvis at implementere en forretningsgrænseflade (containeren kan generere den til dig).

For eksempel erklærer du en statsløs session bønne ved hjælp af @Stateless kommentar på Java-klassen. For stateful bønner, den @Fjerne annotering er markeret på en bestemt metode for at indikere, at bønneinstansen skal fjernes, når et opkald til den markerede metode er afsluttet.

For at reducere mængden af ​​information, du skal angive for en komponent, har ekspertgruppen vedtaget en konfiguration-efter-undtagelse tilgang, hvilket betyder, at du giver intuitive standardindstillinger for alle kommentarer, så de fleste af de almindelige oplysninger kan udledes.

Den nye persistensmodel

De nye enhedsbønner er også kun POJO'er med et par kommentarer og er ikke vedvarende enheder ved fødslen. En enhedsforekomst bliver vedvarende, når den først er knyttet til en EntityManager og bliver en del af en vedholdenhedskontekst. En persistens-kontekst er løst synonymt med en transaktionskontekst; med strenge ord eksisterer det implicit sammen med en transaktions rækkevidde.

Enhedsforholdene defineres også gennem annoteringer. Derudover udføres O / R-kortlægning også gennem annoteringer, og der ydes support til flere databasespecifikke operationer. Med EJB 2.1 brugte udviklere deres egne designmønstre eller anvendte ikke-bærbare teknikker (for eksempel strategier til automatisk generering af nøgler).

Gravning dybt

Det er nu tid til at komme nærmere ind på de forslag, der er fremsat i EJB 3.0's tidlige udkast. Lad os starte med alle fire typer virksomhedsbønner og derefter gå videre til forslagene, der er generiske for hele EJB-programmeringsmodellen.

Statsløse session bønner:

En statsløs session bønne (SLSB), skrevet på EJB 3.0 måde, er bare en almindelig Java-fil med en klassebemærkning på @Stateless. Bønneklassen kan implementere javax.ejb.SessionBean interface, men er ikke påkrævet for (og vil typisk ikke).

En SLSB har ikke længere en hjemmegrænseflade - faktisk kræver ingen EJB-type det. Bønneklassen implementerer eller muligvis ikke en forretningsgrænseflade. Hvis det ikke implementerer nogen forretningsgrænseflader, genereres en forretningsgrænseflade ved hjælp af alle de offentlige metoder. Hvis kun visse metoder skulle eksponeres i forretningsgrænsefladen, kan alle disse metoder markeres med @BusinessMethod kommentar. Som standard er alle genererede grænseflader lokale, men @Fjern kommentar kan bruges til at angive, at der skal genereres en ekstern grænseflade.

De følgende få kodelinjer er nok til at definere en Hej Verden bønne. Med EJB 2.1 ville den samme bønne have krævet mindst to grænseflader, en implementeringsklasse med flere tomme metodeimplementeringer og en installationsbeskrivelse.

import javax.ejb. *; / ** * En statsløs session bønne, der anmoder om, at der genereres en ekstern forretningsgrænseflade * til den. * / @Stateless @Remote offentlig klasse HelloWorldBean {public String sayHello () {return "Hello World !!!"; }} 

Se ressourcer for den komplette kildekode, der ledsager denne artikel.

Stateful session bønner

Historien med stateful session beans (SFSB) er stort set den samme for SLSB, bortset fra et par SFSB-specifikke punkter:

  • En SFSB skal have en måde at initialisere sig selv (leveret gennem ejbCreate () metode i EJB 2.1 og tidligere). EJB 3.0-specifikationen foreslår, at sådanne initialiseringsmetoder leveres som brugerdefinerede metoder og eksponeres gennem bønnens forretningsgrænseflade. Det påhviler nu klienten at kalde passende initialiseringsmetoder, inden bønnen bruges. Ekspertgruppen diskuterer stadig behovet for at give en kommentar, der markerer en bestemt metode til initialisering.
  • Bønneudbyderen kan markere enhver SFSB-metode med @Fjerne annotation for at indikere, at bønneinstansen skal fjernes, efter at den annoterede metode er kaldt. Igen diskuterer ekspertgruppen stadig, om en facilitet er nødvendig for at indikere, at bønnen ikke skal fjernes, hvis metoden ikke udføres normalt.

Her er min mening om de to åbne emner:

  • Skal der findes en kommentar til initialiseringsmetoden? Min stemme er ja - med den antagelse, at containeren vil sikre, at mindst en af ​​initialiseringsmetoderne kaldes, før der kaldes på nogen anden forretningsmetode. Dette beskytter ikke kun mod utilsigtede programmeringsfejl, men gør også containeren mere sikker på at genbruge SFSB-forekomster. Af klarhedshensyn skal jeg her nævne, at nej udpeget initialisering metoder (som f.eks ejb Opret) overvejes ekspertgruppen overvejer kun at have en kommentar til at markere en metode som en initialiseringsmetode.
  • Skulle det kunne konfigureres, at unormal opsigelse af @Fjerne metode fjerner ikke bønneinstansen? Igen er min stemme ja. Det giver kun bedre kontrol til bønneudbyderen og klientprogrammerere. Der er kun et spørgsmål tilbage: hvad sker der med de bønner, der er markeret som? ikke fjernet ved et mislykket opkald til fjernelsesmetoden og en bestemt instans fjernelsesmetode fuldføres aldrig med succes? Der er ingen måde at fjerne disse forekomster programmatisk på, men de fjernes ved timeout for session.

Se kildekoden for et eksempel på SFSB.

Beskedstyrede bønner

Beskedstyrede bønner (MDB'er) er den eneste slags bønner, der skal implementere en forretningsgrænseflade. Denne grænseflades type angiver den type beskedsystem, som bønnen understøtter. For JMS (Java Message Service) -baserede MDB'er er denne grænseflade javax.jms.MessageListener. Bemærk, at MDB-forretningsgrænsefladen ikke virkelig er en forretning interface, det er bare en messaging-grænseflade.

Enhedsbønner

Enhedsbønner er markeret med @Enhed annotation og alle egenskaber / felter i enhedens bønneklasse ikke markeret med @Transient annotering betragtes som vedvarende. Enhedsbønne vedvarende felter eksponeres gennem egenskaber i JavaBean-stil eller ligesom som offentlige / beskyttede Java-klassefelter.

Enhedsbønner kan bruge hjælperklasser til at repræsentere enhedens bønnetilstand, men forekomster af disse klasser har ikke en vedvarende identitet. I stedet er deres eksistens stærkt bundet til den bønnerinstans, der ejer enheden; også disse objekter kan ikke deles på tværs af enheder.

Se kildekoden for nogle eksempler på enhedsbønner.

Enhedsforhold

EJB 3.0 understøtter både ensrettet og tovejsforhold mellem enhedsbønner, som kan være en-til-en, en-til-mange, mange-til-en eller mange-til-mange relationer. Imidlertid skelnes de to sider af et tovejsforhold som ejersiden og den omvendte side. Den ejer side er ansvarlig for at udbrede ændringer i forhold til databasen. For mange-til-mange foreninger skal ejersiden angives eksplicit. Faktisk er det bagsiden, der er specificeret af isInverse = sand annoteringsmedlem på bagsiden MangeToMany kommentar herfra udledes ejersiden. Sagde ikke ekspertgruppen det gjorde EJB lettere?

O / R-kortlægning

O / R-kortlægningsmodellen har også ændret sig væsentligt fra den abstrakte-persistens-skema-baserede tilgang til en dvale-inspireret. Selvom ekspertgruppen stadig diskuterer modellen, og der kun vises et klart billede med det næste udkast, indeholder dette udkast klare indikationer af den overordnede tilgang.

For det første vil O / R-kortlægningen blive specificeret i selve enhedens bønneklasse ved annoteringer. Tilgangen er også at henvise til konkrete tabeller og kolonner i stedet for det abstrakte persistensskema. O / R-kortlægningsmodellen har iboende understøttelse af native SQL; det vil sige support på et dybere niveau, ikke kun evnen til at køre native SQL-forespørgsler. For eksempel definerer kolonnedefinitionen kommentar (@Kolonne) har et medlem columnDefinition det kan være noget lignende columnDefinition = "BLOB IKKE NULL".

Klientprogrammeringsmodel

En EJB-klient kan tilegne sig en reference til bønnens forretningsgrænseflade ved hjælp af injektionsmekanismen (@Indsprøjte kommentar). Brug af det nyligt introducerede @ javax.ejb.EJBContext.lookup () metoden er en anden tilgang. Men specifikationen er ikke klar over, hvordan en enkeltstående Java-klient erhverver henvisning til en bønneinstans, da de enkeltstående Java-klienter kører i en J2EE-klientcontainer og mangler adgang til @ javax.ejb.EJBContext objekt. Der er endnu en mekanisme - et nyligt introduceret universelt kontekstobjekt: @ javax.ejb.Context (). Men igen siger specifikationen ikke, hvordan dette objekt kan bruges i en klientcontainer.

EJB QL

Forespørgsler kan defineres gennem @NamedQuery kommentar. To medlemmer af denne kommentar er navn og queryString. Når denne forespørgsel er defineret, kan du få adgang til den ved hjælp af EntityManager.createNamedQuery (navn) metode. Du kan også oprette en regelmæssig forespørgsel i JDBC-stil (Java Database Connectivity) ved at ringe EntityManager.createQuery (ejbqlString) eller en indfødt forespørgsel ved hjælp af EntityManager.createNativeQuery (nativeSqlString).

EJB QL-forespørgsler kan have både positionelle såvel som navngivne parametre. Det javax.ejb. forespørgsel interface giver metoder til at indstille disse parametre, udføre opdateringer, liste resultater osv.

Her er et eksempel på, hvordan en EJB QL-forespørgsel kan oprettes og udføres:

.. .. @NamedQuery (name = "findAllCustomersWithName", queryString = "VÆLG c FRA Kunde c HVOR c.navn LIKE: custName") .. .. @Inject public EntityManager em; kunder = em.createNamedQuery ("findAllCustomersWithName") .setParameter ("custName", "Smith") .listResults (); 

Følgende viser nogle af de flere forbedringer, der er foretaget i selve QL: