Open Source Enterprise Frameworks Spring Emerged as lightweight alternative to over-engineered “J2EE” Now suite of OSGi modules "Transparent" dependency injection and transaction management Ala carte services Hibernate ORM ("Object Relational Mapping" for RDBMS to Object mapping) Robust, best-in-class product Sophisticated optimization and customization (with learning curve) Reverse engineering of legacy databases SiteMesh High-Level View of Frameworks Spring • Key design principles/implementation techniques totally "mainstream" • Configuring/using Spring still is not simple – Grails manages this... Hibernate • "Industrial strength" • Should compare against commercial products like Oracle • As subtle and complex as what it simplifies?-- Grails manages this... SiteMesh • Just infrastructure, transparently available to use Where to Download Spring http://www.springsource.com/download/community Projects: – Spring Framework – Spring Grails – Spring Web Flow Hibernate http://www.hibernate.org/downloads SiteMesh https://github.com/sitemesh/sitemesh2 Spring: "Strategic" considerations • "The original" J2EE alternative • Enterprise apps need Lightweight Containers • Keeps on sprouting new modules (e.g., Batch, Web Flow, LDAP...) • OSGI-enabled Spring may be the “new” WJB4 … • SpringSource seems to be doing just fine – Groovy and Grails – SpringSourceToolsSuite – WaveMaker: “WYSIWYG Java studio” – vFabric tc Server: “Enterprise Tomcat server” – VMWare vFabric: “Develop virtual and cloud applications faster using the Spring framework; deploy to runtime optimized for Spring Spring: part of VMware (http://www.vmware.com/products/) Spring: Key Design Approaches/Features • POJOs rule! Even EJB3 is built around POJOs. • DI (Dependency Injection) instead of Service Locator ("Lookup") • "Convention, not configuration" • Mechanisms/conventions should not dominate coding efforts • Java code annotations can replace external XML • Declarative services, like transactions • "Modular" functionality; as in real OSGi • Don't reinvent, provide adapters to reuse "best-of-breed" available solutions • Enable pluggability at core subsystem level (for example, view layer) as well as for add-on features like security • Support for testing throughout the development life cycle is crucial Spring 3.0 (NOT xml...) • Supports specs Java SE 5 and above; Servlet 2.4 and above • Annotations not XML! – Annotation-based components: • @Value expressions, referring to dynamic #{…} expressions or static ${…} placeholders – "Meta-Annotations": • custom @MyService annotation for @Service, @Scope("request") and @Transactional(readOnly=true) – Standardized dependency injection annotations: • @inject, @Autowired, ... – Declarative model validation based on constraint annotations • @NotNull, @Min(1), ... – Enhanced binding and annotation-driven formatting • @DateTimeFormat, ... Spring 3.0: SpEL, Portlets, OXM, etc. • Spring expression language (SpEL): like Unified EL ( JSTL Expression Language) • REST support – URI variable extraction through @PathVariable parameters – RestTemplate for Client-side REST support • Portlet 2.0 support – @ActionMapping, @RenderMapping, @ResourceMapping, @EventMapping, ... • Object/XML Mapping (OXM) – From Spring Web Services – Support for JAXB 2, Castor, etc. • Enhanced scheduling capabilities – TaskScheduler and Trigger mechanisms – @Async and @Scheduled annotations now. T – Supports both native and server-managed thread pools Spring3 Spring expression language (SpEL): @Component public class CountryAwareLogic { ... @Autowired public void setCountry( @Value("#{systemProperties.country}") String country) { this.country=country; } } Spring3 Excellent support for REST by annotatiions @RequestMapping(value = "/reward/{id}", method = GET) public Reward show(@PathVariable("id") long id) { } return rewardsAdminService.findReward(id); Support for "web conversations" Should be more like what Seam offers Incorporated current Spring Web Flow project which continue to add more extensions Spring3 Changes Mostly backwards-compatible with Spring2/Spring 2.5 Deprecated (but still useable) – "Legacy" MVC Controllers like SimpleFormController – JUnit 3 Spring-customized test classes New coding should use instead – "Legacy" MVC Controllers like SimpleFormController – JUnit 4 Spring-customized test classes No single distribution package "spring.jar:" – Modular jars were always an alternative – Deploy using Maven2, Ivy, or OSGi (somewhat "bleeding edge") What does Spring contribute to Grails? Dependency Injection – AOP (Aspect Oriented Programming) – (solving “wiring-at-startup”) for automating services Spring MVC as Web framework Simple example: Dependency Injection (from http://martinfowler.com/articles/injection.html#InversionOfControl) public interface MovieFinder { List findAll(); } class MovieLister { … public Movie[] moviesDirectedBy(String arg) { List allMovies = finder.findAll(); for (Iterator it = allMovies.iterator(); it.hasNext();) { Movie movie = (Movie) it.next(); if (!movie.getDirector().equals(arg)) it.remove(); } return (Movie[]) allMovies.toArray(new Movie[allMovies.size()]); } private MovieFinder finder; public MovieLister() { finder = new ColonDelimitedMovieFinder("movies1.txt"); … } 13 What is Dependency Injection? "...For this new breed of containers the inversion is about how they lookup a plugin implementation. In my naive example the lister looked up the finder implementation by directly instantiating it. This stops the finder from being a plugin. The approach that these containers use is to ensure that any user of a plugin follows some convention that allows a separate assembler module to inject the implementation into the lister. As a result I think we need a more specific name for this pattern. Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection." (from http://martinfowler.com/articles/injection.html#InversionOfControl) 14 References on Dependency Injection "A beginners' guide to Dependency Injection": http://www.theserverside.com/tt/articles/article.tss?l=IOCBegi nners "DI: What's all the hype (Green Paper)" http://www.manning.com/prasanna/ Comparison of IOC (Inversion of Control) containers: http://www.picocontainer.org/comparisons.html Tutorials on Spring DI: http://learnspringframework.blogspot.com/2006/10/what-isioc.htmlhttp://edudev.hfoss.org/index.php/Spring_Framework_ Part_I-The_Context 15 Other frameworks: Dependency Injection/ Inversion of Control Guice http://.code.google.com/p/google-guice Picocontainer http://www.picocontainer.org/introduction.html code snippet showing use in web application: http://www.picocontainer.org/web-frameworks.html code snippet showing use from main: http://www.picocontainer.org/component-configuration.html http://nanocontainer.codehaus.org/ http://www.keelframework.org/index.shtml http://hivemind.apache.org/ 16 How does Grails leverage Spring for DI? (1) NOT xml! Just regular Groovy script file that contains Spring DSL … grails-app/conf/spring/resources.groovy example: import org.springframework.jmx.support.MBeanServerFactoryBean import org.springframework.jmx.export.MBeanExporter import org.hibernate.jmx.StatisticsService Beans = { …. // Hibernate statistics collection. hibernateStats(StatisticsService) { statisticsEnabled = true sessionFactory = ref("sessionFactory") } ... 17 How does Grails leverage Spring for DI? (2) … grails-app/conf/spring/resources.groovy example: Beans = { …. (con.) mbeanServer(MBeanServerFactoryBean) { locateExistingServerIfPossible = true } exporter(MBeanExporter) { server = mbeanServer beans = ["org.hibernate:name=statistics": hibernateStats] } } (from Smith and Ledbrook, Grails inAction) 18 Comparing Spring xml vs. Grails for DI (1) spring-app.xml: <bean id=”somebean” class=”x.y.Ex”> scope=”prototype” autowire=”byType” init-method=”init” destroy-method=”finish” > resources.groovy: somebean(x.y.Ex) { b → b.scope=”prototype” b.autowire=”byType” b.init-method=”init” b.destroy-method=”finish” } 19 Comparing Spring xml vs. Grails for DI (2) spring-app.xml: <bean id=”somelist” class=”x.y.List”> <property name=”items”> <list> <value>1</value> <value>2</value> <value>3</value> </list> </property> </bean> resources.groovy: somelist(x.y.List) { Items =[ 1, 2, 3 ] } 20 Comparing Spring xml vs. Grails for DI (3) spring-app.xml: <bean id=”beanWithStaticFactoryMethod” class=”x.y.ExSrF”> factory-method=”create” /> <bean id=”beanWithFactoryMethod” class=”x.y.ExF”> factory-bean=”someFactory” factory-method=”create” /> resources.groovy: beanWithStaticFactoryMethod(x.y.ExSrF) { b → b.factory-method=”create” } beanWithFactoryMethod(someFactory:”create” ) (from Smith and Ledbrook, Grails inAction) 21 Spring xml can still help in Grails for DI (1) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http:// www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <!-- more bean definitions go here... --> <!-- Mail service --> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSender Impl"> <property name="host" value="smtp.mac.com"/> <property name="port" value="587"/> <property name="username" value="mikesalera"/> <property name="password" value="**************************" /> ... 22 Spring xml can still help in Grails for DI (2) ... <property name="javaMailProperties"> <props> <!-- Use SMTP-AUTH to authenticate to SMTP server --> <prop key="mail.debug">false</prop> <prop key="mail.smtp.auth">true</prop> <!-- Use TLS to encrypt communication with SMTP server -> <prop key="mail.smtp.starttls.enable">true</prop> </props> </property> </bean> </beans> 23 What is Aspect-Oriented Programming? The "next buzzword" after "Objects" and "Components" and "SOA" and ... A meta-framework for EJB- (or .NET-) like frameworks which provide infrastructure "services" to applications "... clean modularization of crosscutting concerns, such as error checking and handling, synchronization, context-sensitive behavior, performance optimizations, monitoring and logging, debugging support, and multi-object protocols..." (from the AspectJ homepage) 24 What is Aspect-Oriented Programming? Object Oriented Programming does NOT address "cross-cutting concerns" • Concerns which "cut across" object boundaries • Tend to be the responsbility of MANY classes,and must be handled the same way, in order to work correctly • Need "separation of concerns" to modularize these aspects Extrafunctional features should NOT be coded by applications programmers • Extrafunctionality tends to be omnipresent; maintenance burden • Infrastructure should be supplied by infrastructure experts • Applications programmers should code domain functionality How extrafunctionality gets"blended in" without hard-coding everywhere • Declarative, not imperative, specification of extrafunctionality – Think A + 5.2 = 100; not A = 100 - 5.2 – "Policy versus mechanism" 25 "History" of AOP for Java • Original implementation in AspectJ only for fanatics – AspectJ introduced a "preprocessor" which augmented the standard Java language – After JDK 1.5 introduced annotations, AspectJ converted to use standard JDK annotations • AspectWerkz emerged as the "lightweight" alternative; later merged into AspectJ • JBoss-AOP is specific to JBOSS EJB3 application server • As AOP became more mainstream and numerous AOP alternatives emerged, AOP Alliance created a standard 26 Spring Support for wider/other AOP • Spring is compliant with the AOP Alliance interface for around advice using method interception • "Injected AspectJ aspects" – Spring can weave into an application's class files as they are being loaded into the Java virtual machine – called Load-Time Weaving (LTW) – see Spring Reference Doc. (Sec. 6.8.4 in Spring 2.5.5; Sec. 7.8 in Spring 3.0) 27 AOP: Basic Concepts • Aspect: a crosscutting or extrafunctional concern (e.g., transaction management). • Join point: a recognizable point during the execution of a program, such as the execution of a method or the handling of an exception. • Advice: action taken by an aspect at a particular join point. • Pointcut: a set of join points; a language to describe matching join points. • Target object: object being advised by one or more aspects. Also referred to as the advised object. • AOP proxy: an object created by the AOP framework in order to implement the aspect contracts (advise method executions and so on). • Weaving: linking aspects with other application types or objects to create an advised object. • Introduction: declaring additional methods or fields on behalf of a type. 28 AOP: Meter reading analogy (SIA 2 book) • • • • • Aspect: meter reader's daily combination of what to do, where Join point: which devices to read Advice: recording the reading; re-marking the device Pointcut: which premises to visit. Introduction: ad hoc actions, based on phoning headquarters. But it's hard to get these to work in the real-world analogy, since they are implementation mechanisms. • Target object • AOP proxy • Weaving 29 AOP Architecture • Low-level implementation layer – Mechanisms to implement weaving on the target platform • – Environment-specific Middle-level functionality layer – Declarative specification or meaning, plus – Mechanisms to implements these semantics • – Bound to a particular environment Application-level development layer – Language (UI/modeling tool?) to customize the specification – Other tools such as type-checking, trace/visualization tools, debuggers... 30 AOP Concepts in Spring • Aspect: POJOs; may implement Aspect interfaces or be annotated with @Aspect. • Join point: intercepting method execution. • Advice: method; may have reflection-like signature; Spring establishes a chain of interceptors around the join point. • Pointcut: AspectJ pointcut expression language by default; alsoJdkRegexp and Default Pointcuts. • Target object: an object which is wrapped by a runtime proxy. • AOP proxy :JDK dynamic proxy or a CGLIB proxy, implemented by Spring. • Weaving: performed at runtime during Spring container intialization. • Introduction: for example, Spring can introduce the IsModified interface to make a bean support a caching strategy. 31 Kinds of Spring Advice • Before – org.springframework.aop.MethodBeforeAdvice • After returning – org.springframework.aop.AfterReturningAdvice • After throwing – org.springframework.aop.AfterReturningAdvice • Around – org.aopalliance.intercept.MethodInterceptor • Introduction – org.springframework.aop.IntroductionInterceptor 32 Spring AOP Options • "Classic" Spring AOP (ProxyFactoryBean/AutoProxyCreator) – all versions of Spring – can use table-like Java code, or code-like sections in Spring config – "Spring AOP Support/Classic Spring proxy-based AOP" • XML AOP (Auto Created Proxy) – Spring 2.x+ only – No footprint in POJO's – "Schema-based AOP Support/Pure POJO Aspects" • @AspectJ AOP (Auto Created Proxy) – Spring 2.x+ only – Advice, pointcuts are in Java annotations (includes needed) – "@AspectJ Support/@AspectJ annotation-driven aspects" 33 "Classic" Proxy-based Spring AOP Mechanism • During bean post processing phase of Spring setup, the ProxyFactory will create and hook in the Proxy • Core functionality applies Advice (regular Java code) at Pointcuts (specified methods) through intercepting when the advised class implements an interface • This works using the JDK Proxy mechanism, which intercepts interface methods) • The bean needs to be a ProxyFactory which hooks up the the "Advice" to the "Advised" • This can be done in code (which implies it can be done on-thefly if desired) OR in Spring xml config 34 Implementation-Level Spring AOP Alternatives (1) • Mechanism: "traditional" JDK Proxy versus CGLIB proxies • What is the difference? – CGLIB dynamically generates bytecode for new subclass which overrides advised methods – Only CGLIB-generated proxies can provide exact type match to proxied object – CGLIB restrictions: • cannot override final methods • must configure added CGLIB jar file 35 Implementation-Level Spring AOP Alternatives (2) • Which is more efficient? – JDK Proxy intercepts every method, whether or not code needs injected; CGLIB will only override methods that need code injection – For CGLIB, constructor invoked twice: on both actual proxied object and an instance of generated subclass that implements the advice. – Both potentially optimizable by HotSpot JVM • Which will Spring choose? – JDK dynamic proxies are preferred if there's a choice – Spring 2.0: JDK Proxy for target objects that implement at least one interface; otherwise CGLIB 36