
Java EE 6 & Spring: A Lover’s Quarrel Derrick Kittler Mauricio “Maltron” Leal Vamsi Chemitiganti Agenda o The goal of this talk o Evolution of Spring o Evolution of Java EE 6 o Side-by-Side o Migrating o Java EE 6 and Spring Coexistence o Conclusion Fair Comparison Orange Apple Fair Comparison: NOT Java EE 6 Specification Technology Framework Fair Comparison Java EE 6 Approach to a Enterprise Solution !! If can’t beat them, join them !!!! Java EE 6 Sometimes, a join solution can be the best approach The goal of this talk is NOT… Compare both Java EE 6 technologies and declare a winner The goal of this talk is… • How to deliver a good enterprise application • Evaluate both technologies • Show some migration path (only when makes sense) Technology Choice: The big picture Developer’s Costs Skill Set Java EE 6 Vendor Monitoring Support Infrastructure Skill Set Evolution of Spring Dependecy Proble Specific Annotation driving JSR 300 “at inject” A new “C” Mobile features Injection XML wiring New Spring namespace Modern Web POJO Extensible Automatic bean Expression Configuration Data Access oriented Configuration configuration Language profiles Social development Bean Scoping New annotation First-class REST Unified property Security Declarative Groovy, JRuby driven MVC support resolution Cloud Ready AOP & and BeanShell framework Java based Java configuration transactions JSP tag library JUnit 4-based configuration features MVC Java 5 integration testing Several new Servlet 3.0 support Framework autoboxing and Spring MVC Declarative generics features caching Support for JSR Spring MVC 303 declarative enhancements validation Scheduled Jobs What is Spring ? • Explicit Configuration • Aspect oriented • Ease-of-use abstractions over lower-level, general purpose API’s like JDBC, JMS and JavaMail • More flexibility for fine grained control, but more complexity • Deployment/Runtime complexity • Uses a Java EE container underneath Spring Data Spring for Apache Hadoop Redis HBase GemFire JPA QueryDSL HDFS MapReduce Hive MongoDB Neo4j Soir JDBC Splunk Pig Cascading SI/Batch Google App Engine AWS Beanstalk Spring Batch Spring Integration Spring Social Heroku Spring AMQP Spring Roo Twitter LinkedIn FaceBook Cloud Foundry Spring Web Flow Spring Web Services OpenShift Spring Security Spring Secure OAuth Tomcat 5+ Spring Framework GlassFish 2.1+ DI AOP TX JMS JDBC ORM OXM Scheduling WebLogic 9+ MVC REST JMX Testing Caching Profiles Expression WebSphere 6.1+ Java EE 1.4+ / SES+ JPA 2.0 JSF 2.0 JSR 250 JSR 330 JSR 303 JTA JDBC 4.1 JMX 1.0+ Spring JMS Configuration Java EE 6 Evolution of J2EE (later Java EE) May’98 Dec’99 Sep’01 Nov’03 May’06 Dec’09 Apr’13 Enterprise Robust Web Ease Productivit Application Scalable Services Development Lightweight y & HTML 5 Project J2EE 1.2 J2EE 1.3 J2EE 1.4 Java EE 5 Java EE 6 Java EE 7 JPE EJB 1.0 EJB 1.1 EJB 2.0 EJB 2.1 EJB 3.0 Prunning JMS 2.0 Servlet 2.1 Servlet 1.1 (CMP, MDB, Servlet 2.4 JPA 1.0 Extensibility Batch JSP 1.1 local EJB) JSP 2.0 JSF 1.2 CDI Caching JMS 1.0.2 Servlets 2.3 Web Servlets 2.5 JAX-RS TX JDBC 2.0 (Event, Services JSP 2.1 Servlet 3.0 Interceptor JNDI 1.2 Filters) JMX (Common EJB 3.1 Lite WebSocket JAF 1.0 JSP 1.2 J2EE EL) JSON JTA 1.0 JDBC 2.1 Deploy JAXB, JAX-RS 2.0 JTS 0.95 JCA 1.0 JACC SAAJ, JavaMail 1.1 JAAS 1.0 JAAS WebService JAXP 1.0 JAX-RPC Injection JAXR JSTL 10 specs 13 specs 20 specs 24 specs 28 specs 32 specs Lessons learned with Spring Project J2EE 1.2 J2EE 1.3 J2EE 1.4 Java EE 5 Java EE 6 Java EE 7 JPE • One monolitic server • Lightweight and • Hard to decouple technologies Heavyweight servers (separated • Heavyweight by Profiles) • Technologies doesn’t depend solely on containers • CDI is a gamer changer • Arquilian is ALSO a gamer changer Java EE 6 Highlights • Extensibility • Enhanced easy of Development • JSF 2.1 • Built-In AJAX • Expanded View Model • Profiles Java • Vendor Support EE 6 • CDI (Contexts & Dependency Injection) What is CDI anyway ? MyInterface hello = new MyImplementation(); What I want How is going to work What is CDI anyway ? @Inject MyInterface hello; • Less coding = More Productivity • Server (Container) “injects” the other part FOR YOU • Loose coupling Hollywood Principle: • Refactoring easy “Don’t call us, • Easy Maintenance we will call you” Java EE 6 Side-by-Side • Java EE 6 and Spring are both capable middleware solutions • Functionally equivalent Java EE 6 for the most part, with very different approaches • For very vanilla applications, code is almost identical Java EE vs Spring Framework Features Java EE 6 Spring Framework Dependency JSR 250 JSR 330 CDI JSR 250 JSR 330 Spring IoC Injection Container Spring AOP Inteceptor Decorator AspectJ AOP Persistence JPA 2 JPA 2 Hibernate JDBC iBATIS JDO Transactions JTA EJB 3.1 JTA JDBC JPA Hibernate JDO Presentation Spring JSF 2 JSF 2 Struts Tapestry WebWork Framework MVC Spring MVC JAX- Web JAX-WS JAX-RS JAX-WS XFire Services REST RPC Messaging JMS EJB 3.1 JMS Testing CDI EJB 3.1 JPA 2 JUnit TestNG Spring Framework and Java EE 6 (Side-by-Side) Components Spring MVC/IoC/Security/JPA/JAX-WS JSF/CDI/JAAS/JPA/JAX-RS/JAX-WS JBoss EAP 6 Server Tomcat 7 11 Kb (WAR file) File Size 32,153 Kb (WAR file) JARs/ XMLs 0 / 4 36 / 5 Configuration 37 Lines 92 Pre-Deploy 33 Mb Heap / 48 Mb Perm Memory 23 Mb Heap / 21 Mb Perm Post-Deploy 41 Mb Heap / 84 Mb Perm Memory 107 Mb Heap/ 52 Mb Perm Memory (100 71 Mb Heap / 92 Mb Perm Threads) 81 Mb Heap/ 47 Mb Perm Response 2459 ms (average) Time 1100 ms (average) Should I migrate my current Spring application to Java EE 6 ? Why ? To migrate or not to migrate ? • Application is a legacy (written in early versions of Spring) • A real benefit will come Java EE 6 from a migration • Faster • More secure • Easy to manage • Support from multiple vendors Java EE 6 CDI and IoC Java EE 6 @Named @Controller @RequestScoped @Scope(“request”) public class PersonBean { public class PersonBean { @Inject @AutoWired private SocialID social; private SocialID social; Persistence Java EE 6 @Stateless @Repository public class PersonDAO { public class PersonDAO { @PersistenceContext @PersistenceContext private EntityManager em; private EntityManager em; Persistence Java EE 6 @Stateless @Repository public class PersonDAO { public class PersonDAO { @Resource @Autowired private DataSource ds; private JdbcTemplate temp; public void save(Person p) { public void save(Person p) { try { temp.update( Connection c = “insert … values (?,?)”, ds.getConnection(); p.name(), p.age()); PreparedStatement ps = } c.prepareStatement(“… } ps.setString(1, p.name()); ps.setInt(2, p.age()); ps.execute(); … Transaction and Exception Java EE 6 @TransactionAttribute(…) @Transactional(…) @Stateless @Repository public class PersonDAO { public class PersonDAO { @PersistenceContext @PersistenceContext private EntityManager em; private EntityManager em; Transaction and Exception Java EE 6 @ApplicationException(rollback=tr @Transactional(rollbackFor=DaoExc ue) eption.class) public class DAOException public class PersonController { extends Exception { Web Java EE 6 @Named @Controller @RequestScoped @Transactional public class PersonMBean { public class PersonController { private Person p; @Autowired private List<Person> ls; private PersonDAO dao; @Inject @RequestMapping(“/add”) private PersonDAO dao; public ModelAndView add(Person p) { public void save() { dao.save(p); dao.save(p); ModelAndView mv = new resetForm(); ModelAndView(“ok”); } mv.addObject(“person”, … dao.list); return mv; WebService (SOAP) Java EE 6 @WebService @WebService public class PersonWS { public class PersonWS extends SpringBeanAutowiringSupport { @Inject private PersonDAO dao; @Autowired private PersonDAO dao; public List<Person> list() { return dao.list(); public List<Person> list() { } if(dao == null) … injectionContext(this); … … WebService (REST) Java EE 6 @Path(“/”) @Controller public class PersonResource { public class PersonResource { @Inject @Autowired private PersonDAO dao; private PersonDAO dao; @GET @RequestMapping( @Path(“/person/{id}”) value=“/person/{id}”, @Produces(“application/json”) produces={“application/json”} public Person method=RequestMethod.GET) load(@PathParam(“id”)Long ID) { @ResponseBody return dao.seek(ID); public Person } load(@PathVariable(“ID”)Long ID) … { return dao.seek(ID); … Messaging Queue Java EE 6 InitialContext ic = … @Autowired JmsTemplate t; ConnectionFactory cf = … @Autowired Queue q; Connection c = … public void sendMessage() { Session s = c.createSession(… this.t.send(q, new TextMessage m = s.createText( MessageCreator() { “hello”); public Message Queue q = (Queue)ic.lookup(… createMessage(Session s) throws QueueSender sender = … JMSException { Sender.send(m); return s.createTextMessage(“hello”); c.close(); }}); } Java EE 6 Java EE 6 and Spring coexistence Java EE 6 • Integration with Java EE API’s • Spring beans can be injected into JSF Managed Beans • Spring beans can be referenced in EL with no JSF Backing beans • Spring JmsTemplate can be used on top of raw JMS API for convenience • Spring Listeners similar to EJB MDB especially JCA rather than JMS listeners • Hibernate validator standardized as Bean Validation (JSR 303) • Spring 3 supports excellent bi-directional integration with EJB’s • CDI and Spring Integration through the Spring Bridge to CDI • Native support for Java EE • Java EE 6 annotations supported by Spring • Spring can use JPA / Hibernate natively • Application Server Integration • DataSources can use application Server QoS pooling, transactions, statement caching, debugging, monitoring and security
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages49 Page
-
File Size-