580 likes | 781 Views
Best Practices for Migrating Spring to. JAVA EE 6. WTF ?!?. Bert Ertman Fellow at Luminis in the Netherlands JUG Leader for NLJUG and a Java Champion. Who is this talk for?. You are using old school Spring and wonder how to move forward
E N D
Best Practices for Migrating Spring to JAVA EE 6 WTF ?!?
Bert Ertman Fellow at Luminis in the Netherlands JUG Leader for NLJUG and a Java Champion
Who is this talk for? • You are using old school Spring and wonder how to move forward • Java EE seems to be hot again, should you jump on this train? • You love the J2EE Design and Development book; but is it still actual?
Why listen to us? • We’re not working for an application server vendor • We’re no Rod Johnson groupies either • We’ve worked extensively with J2EE, Spring and modern Java EE • Had endless Java EE vs. Spring discussions...
Why migrate? • Spring is proprietary technology • Upgrading from old school Spring requires a lot of work anyway • Why not take it to the standard?
Let’s get a couple of misunderstanding out of the way first...
Isn’t Java EE too fat? • Startup times with application deployed • JBoss AS 7 ~2 seconds • Glassfish V3 ~4 seconds • Tomcat 6 + Spring ~4 seconds • Java EE 6 WAR file < 100kb
But I need Dependency Injection • Java EE 6 introduced CDI • More powerful, contextual DI model • Makes the platform extensible in a standard way
But I need AOP! • Really? • You love getting your code all asymmetric and unreadable? • Or are you just using AOP light a.k.a. Spring AOP a.k.a. (Java EE) Interceptors?
Capabilities comparison * Not part of the Java EE specification
Sure it would be fun! realistic?
Typical old school Spring app • lots of complex XML, no annotations • old / outdated ORM solution • (JDBC Templates, Kodo, Toplink etc.) • deprecated extension based Web MVC (SimpleFormController etc.)
Migration Path • Upgrade Spring version • Replace old frameworks (ORM, web framework) within Spring • Run Spring and Java EE container side by side • Replace Spring entirely • Remove Spring container
Migration Path • Upgrade Spring version • Replace old frameworks (ORM, web framework) within Spring • Run Spring and Java EE container side by side • Replace Spring entirely • Remove Spring container
Upgrade Spring version • Upgrade Spring runtime (replace JAR files) • No code / configuration changes
Migration Path • Upgrade Spring version • Replace old frameworks (ORM, web framework) within Spring • Add Java EE code, keep old Spring code • Replace Spring entirely • Remove Spring container
Don’t touch Spring specific APIs yet Web MVC Tasks Spring JDBC Templates Kodo JMS beans JPA JSF Spring beans Replace old frameworks within Spring presentaton layer @AutoWired business layer @AutoWired @AutoWired Data / Integration layer
Migration Path • Upgrade Spring version • Replace old frameworks (ORM, web framework) within Spring • Add Java EE code, keep old Spring code • Replace Spring entirely • Remove Spring container
TX manager AOP ORM Spring application Servlet Container myapp.war Spring container Spring beans Spring beans
Interceptors JPA TX manager Security Java EE application Java EE 6 application server CDI / EJB container myapp.war CDI beans Session beans
Spring container TX manager ORM AOP Spring beans Spring beans Interceptors JPA TX manager Security Mixed Java EE 6 application server CDI / EJB container myapp.war CDI beans Session beans
Spring beans Tasks Spring JDBC Templates JMS beans JPA JSF Run Spring within a Java EE container presentaton layer @AutoWired business layer @AutoWired Data / Integration layer
Spring beans Tasks Spring JDBC Templates JMS beans JPA JSF EJB CDI Add Java EE code, keep old Spring code presentaton layer @AutoWired @Inject business layer @Inject @AutoWired Data / Integration layer
JSF / CDI bean Here we don’t want to know about Spring
Encapsulate Spring with CDI • Write a CDI extension that • bootstraps the Spring container • looks up Spring Beans in the Spring container and publish in CDI context
Migration Path • Upgrade Spring version • Replace old frameworks (ORM, web framework) within Spring • Add Java EE code, keep old Spring code • Replace Spring entirely • Remove Spring container
Spring beans Tasks Spring JDBC Templates JMS beans JPA JSF EJB CDI Replace Spring entirely presentaton layer @AutoWired @Inject business layer @Inject @AutoWired Data / Integration layer
EJB Timers MDB JPA JSF EJB CDI Spring JDBC Templates Replace Spring entirely presentaton layer @AutoWired @Inject business layer @Inject @AutoWired Data / Integration layer
The TX layer • Migrate Spring TX and DAOs to EJB • The TX manager is in the app server • An EJB is transactional by default • EJB has JPA integration
Come on, are you telling me EJBs are cool now? • You bet! • EJBs are just container managed POJOs • Just like Spring beans, but without the container configuration...
DAO Spring
Dealing with Lazy Loading • Many Spring apps use the Open-EntityManager-In-View pattern • EJB has the Extended Persistence Context • more explicit and more powerful
Fixing lazy loading • Keeps an EntityManager open as long a the bean exists
Template addict? • What if I’m hooked to JDBC Template? • Hmm, let’s start the old discussion about whether or not to use ORM • phase 1: denial • phase 2: eventually you will migrate ;-)
Using JDBC Template within Java EE • Can be injected with simple Producer method • Possible because it is not relying on Spring container • some extra dependencies though
Migration Path • Upgrade Spring version • Replace old frameworks (ORM, web framework) within Spring • Add Java EE code, keep old Spring code • Replace Spring entirely • Remove Spring container
Removing dependencies • Our classpath just has to contain APIs, no framework classes • From ~40 dependencies to just 1
What about testing? Spring has always been great at testing • DI makes unit testing possible • Spring test framework makes testing within the Spring container possible • Flexible configuration for multi-environment testing