EJB bez EJB

Líbí se vám nový zápis EJB pomocí anotací? Potřebujete vaši EJB aplikaci nasadit i mimo aplikační server? Potřebujete nakonfigurovat funkční testy EJB? Potom je tu pro vás projekt Pitchfork.

EJB 3 nám umožňují psát svoje beany jako normální oanotované POJO. Což nám kromě zjednodušení vývoje přináší i jiné výhody. Jednou z největších je to, že můžeme použít náš kód i mimo kontejner. Nic nám nebrání v tom, abychom vzali EJB a nakonfigurovali je například pomocí Springu. Ale moment, proč bychom je měli konfigurovat? Vždyť už v nich máme anotace, které nám popisují závislosti mezi beany. Máme tam dokonce i anotace, které nám popisují hranice a typ transakcí. Proč nenaučit Spring, aby si tyto anotace přečetl a sám se podle nich nakonfiguroval?

Naštěstí nic takového dělat nemusíme, vyřešili to za nás BEA a Interface21 projektem Pitchfork. Nebudu vás už dál napínat a ukážu vám jak to nakonfigurovat (plnou verzi konfiguračního souboru najdete zde):

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
	<!-- JPA EntityManagerFactory -->
	<bean id="entityManagerFactory"
	 	class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
 		<property name="persistenceUnitName" value="MyPU" />
 	</bean>
	<bean id="txManager"
		class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	 </bean>

	<bean
	 	class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

	<!-- ejb post processor -->
	<bean class="org.springframework.jee.ejb.config.JeeEjbBeanFactoryPostProcessor">
	 	<property name="serviceEnvironment">
	 		<bean class="org.springframework.jee.config.SimpleServiceEnvironment">
	 			<property name="transactionManager" ref="txManager" />
	 		</bean>
	 	</property>
	 </bean>

	<!-- ***************** EJBs *************************** -->
	<bean id="beanA" class="net.krecan.ejb.BeanA" />
	<bean id="beanB" class="net.krecan.ejb.BeanB" />
</beans>

První co jsme nadefinovali je entityManagerFactory, ta nám zprovozní JPA. Dále musíme přidat transaction manager, který se nám bude starat o transakce. Ani to není žádná věda. Dále máme PersistenceAnnotationBeanPostProcessor, který prohledá všechny beany v aplikačním kontextu, projde si jejich anotace a když narazí na @PersistenceUnit nebo @PersistenceContext, injektne tam co je potřeba. Doposud jsme si vystačili se standardními třídami ze Spring 2. Teď přichází na řadu Pitchfork. JeeEjbBeanFactoryPostProcessor je třída, která opět prohledá všechny beany v aplikačním kontextu, projde si jejich anotace a když narazí na EJB anotaci, tak podle ní nakonfiguruje Spring. Tzn. nastaví závislosti mezi beany a podle potřeby vytvoří transakční proxy. Všimněte si tu prosím konfigurace transakcí. Trvalo mi docela dlouho, než jsem přišel na to, že se to musí nakonfigurovat právě takto.

A to je vše, teď už jenom musíme vyjmenovat všechny beany, které chceme použít. To je nezbytný krok. Musíme říci, které třídy chceme konfigurovat. Tím Springu ušetříme spoustu práce s procházením všech tříd v classpath a hledáním těch správných anotací. Sobě tím ušetříme spoustu času při startu kontejneru.

Vidíme tedy, že se dá Springem docela dobře nahradit hodně z funkcionality EJB kontejneru. Otvírá nám to spoustu možností, od snadného testování EJB až po jejich nasazení bez aplikačního serveru. Docela užitečná věc, nemyslíte?

One Response to “EJB bez EJB”

  1. benzin Says:

    Anotace: Je to dost dvousecna zbran, hlavni vyhodou XML konfiguraku je prave to ze nejsou svazane se tridou. Takze napriklad kdyz pomoci XML nadefinujete persistentni cast aplikace, muzete napriklad zcela jednoduse zmenit jmeno tabulky bez rekompilace.

    Bohuzel to je problem kdyz pouzijete anotace. Nebo treba zvetseni delky pole z 10 na 20 znaku. Pokud to mate v XML tak je to otazka editace XML, bohuzel pokud jste to narvali do anotaci, tak je nutne rebuildovat.

    Ja sam pouzivam hibernate s anotacemi a uz se mi to pomalu zacina vymstivat.