Bridging The Gap
  Integrating Spring and CDI



                       Ray Ploski
                        Director, Developer Programs & Strategy

                                  @rayploski
Protagonists


                 Spring                       Contexts & Dependency Injection
                Since 2004                                   Since 2009

    Popular Enterprise Java Framework         Standard Programming Model for Java EE 6

Conceived to provide an alternative to EJBs              Integrates with EJB

          Dependency Injection                         Dependency Injection

                   AOP                                Cross Cutting Concerns
Commonalities
• Similar Concepts

 • container - managing object
  graphs according to a developer-
  provided blueprint

 • bean - a managed object

• Both Support
 • JSR-330 (@Inject)
 • JSR-250 (Java EE 5 injection,
   Lifecycle Annotations)
Differences
                 JPA          JMS


             JDBC      JSF          JTA   CDI


                 JSP          EJB




                             Spring

•Implicit (CDI) vs. explicit (Spring) blueprint
Seam-Spring Module
    A utility library for integrating
Spring and CDI programming models

         Enables the use of
     Java business components
       across technology lines
Seam 3 Spring Module


• Seam3 - a library of CDI extensions

• Similar functionality to the Seam 2 Spring integration
 • With CDI specific undertones

• Will merge into Apache DeltaSpike
Seam 3 Spring Module


• Seam3 - a library of CDI extensions

• Similar functionality to the Seam 2 Spring integration
 • With CDI specific undertones

• Will merge into Apache DeltaSpike

         +              +   CDISource              DeltaSpike
Seam 3 Modules

               •   Mail
•   Solder
               •   Validation
•   Config
               •   Wicket
•   Social
               •   Catch
•   JMS
               •   Remoting
•   JCR                         Drools   SwitchYard
               •   REST
•   Security
               •   Faces        jBPM        Errai
•   I18N
               •   Spring        TBD      Ecetera
Seam 3 Modules

                                 DeltaSpike
               •   Mail
•   Solder
               •   Validation
•   Config
               •   Wicket
•   Social
               •   Catch          Various JBoss
•   JMS                             Projects
               •   Remoting
•   JCR                         Drools   SwitchYard
               •   REST
•   Security
               •   Faces        jBPM        Errai
•   I18N
               •   Spring        TBD      Ecetera
Seam3 Spring Module
         Design Goals

• Minimize changes to existing code

• Non-intrusive approach

• Highly customizable

• Mirror similar capabilities
Why?
• Reuse existing investments

• Integrate groups with various expertise

• Simplify integration of Spring and Java EE

• Ease migration of legacy Spring apps to
 Java EE 6
Seam 3 Spring Module Features
• Integrating Spring components
  into CDI

 • Accessing Spring
    ApplicationContexts

   • created by the extension
                                     -or-
   • access AC’s created by Spring
      components (e.g. web
      ApplicationContext)

• Accessing CDI beans
 • exposing Spring beans as CDI
    beans
Integrating Spring into CDI
   1.) Get the ApplicationContext
Integrating Spring components into CDI



  Managed                        Managed   • Implemented as a Standard CDI
   Bean        Managed            Bean       Extension
                Bean
                                           • Spring contexts and Spring beans
                                             are installed as CDI beans
  • ApplicationContexts
                                           • Implemented using the resource
  • Spring Beans                             producer pattern
      * Can be bootstrapped or external
ApplicationContext Management

   Spring contexts are exposed as CDI beans


                          	   @Produces @Web @SpringContext
                                ApplicationContext context;

Created by Seam                     Created by Spring
 Spring Module
                     - or -
 - @Producer fields                      e.g. a Web
 - SPI Based                       ApplicationContext
@SpringContext Annotation

1.) Bootstrapped By Spring- CDI Extension



 	 @Produces @SpringContext
 	 @ApplicationScoped
 	 @Configuration
   (locations={"classpath:springCtx.xml"})
 	 ApplicationContext springContext;
@SpringContext Annotation

2.) Used within a CDI Managed Bean




 	 //Usage
 	 @Inject @SpringContext
 	 ApplicationContext context;
@SpringContext Annotation

1.) Web Application Context (external)



 // Spring Application Context loaded by
 // Servlet container

 @Produces @Web @SpringContext
   ApplicationContext context;
Integrating Spring into CDI
  2.) Get access to the Spring Beans
@SpringContext Annotation

2.) Use within a CDI Managed Bean




 	 //Usage
 	 @Inject @SpringContext
 	 ApplicationContext context;
Spring Bean Producer
Apply the resource producer pattern for creating
Spring ApplicationContext CDI beans


@Produces @SpringBean
	 UserService userService;



//Usage
@SessionScoped
public class AllocationManager {
	 @Inject
	 UserService userService;
}
Avoiding Bean Duplication
•Imported Spring beans may cause duplication issues
 • CDI will add any classes automatically as beans
 • Extension-added beans will be in conflict

•Options:
 • Solder @Veto annotation (recommended)
 • Using side-effects of @Typed and @Alternative
  (standard-based but we do not recommend)

• Proprietary extensions for bean scanning (e.g. Weld)
Bean Duplication and Vetoing

                      Importing beans may
                      result in duplication ...




... but vetoing can
solve this problem
In-Extension Context Bootstrapping
  •Alternative to @Produces @SpringContext
   @Configuration

  •Advantages relative to CDI lifecycle
   • Spring context is bootstrapped before
    bean discovery
   • Spring bean classes are automatically
    vetoed
Integrating CDI into Spring
CDI integration into Spring

• Uses standard Spring mechanisms
 • BeanFactories
 • BeanPostProcessors/BeanFactoryPostProcessors

• Most facilities are hidden behind the <cdi:*/>
 namespace
Accessing the Bean Manager


          <cdi:bean-manager/>




         •Usage:
          @Autowired BeanManager beanManager;

xmlns:cdi="http://www.jboss.org/schema/seam/spring"
Accessing CDI Beans

        	<cdi:bean-reference id="user" type="example.User">
               <cdi:qualifier type="example.BusinessUser"/>
       	 </cdi:bean-reference>


       	 @Component 
       	 public class User {

       	     @Autowired User user;

       	 }

xmlns:cdi="http://www.jboss.org/schema/seam/spring"
Importing CDI Beans into Spring
Scoping
•Spring and CDI have different approaches to bean scoping
 • Spring - singletons, application-scoped
 • CDI - prototype, 'default-scoped'

•The module preserves the original scope
 • @SpringContext beans are @ApplicationScoped 

 • @SpringBean are default-scoped and fall back to the native Spring
  scope (AOP scope proxy required)

 • CDI beans are prototype-scoped and fall back to the native CDI
  scope (through their scoped proxy) 
Beyond CDI

•This module can serve as basis
 for integrating any Java EE
 component with Spring
 • EJBs
 • JAX-RS 
 • any component that
   understands CDI
Roadmap

• Current version: 3.1.0.Final (included in Seam 3.1.0.Final)
• Upcoming versions:
  o 3.1.x - minor features, bug fixes

 o   3.2.x (March/April 2012) - additional features
      bean autoimport
      eventing bridge
      bridging Spring AOP/CDI interceptors,decorators
      Seam Persistence integration (transactions, Persistence Contexts)

• Post 3.2
  o integration into Apache DeltaSpike
ENTERPRISE APPLICATION
               PLATFORM
               6.0


JBoss AS 7.1
SUBSCRIPTIONS = DEVELOPER PRODUCTIVITY
                                      Frees you to focus on the new stuff


  NOT JUST FOR ADMINS



“Q: I’m writing a WS-Policy and...”


                                                    A C C E L E R AT E
       KILL                                         YOUR PROJECT!
       DRUDGERY

                                      Fight your bugs, not others’
                                                                           33
                                        http://www.redhat.com/jboss/benefits/
Thank You!
             Seam 3 Spring Module - http://bit.ly/Seam3Spring

         Example Code - http://bit.ly/JUDConSeamSpringCode

                    Apache DeltaSpike - http://bit.ly/zsWz2x

Ray Ploski
Director, Developer Programs & Strategy


    @rayploski

Spring - CDI Interop

  • 2.
    Bridging The Gap Integrating Spring and CDI Ray Ploski Director, Developer Programs & Strategy @rayploski
  • 3.
    Protagonists Spring Contexts & Dependency Injection Since 2004 Since 2009 Popular Enterprise Java Framework Standard Programming Model for Java EE 6 Conceived to provide an alternative to EJBs Integrates with EJB Dependency Injection Dependency Injection AOP Cross Cutting Concerns
  • 4.
    Commonalities • Similar Concepts • container - managing object graphs according to a developer- provided blueprint • bean - a managed object • Both Support • JSR-330 (@Inject) • JSR-250 (Java EE 5 injection, Lifecycle Annotations)
  • 5.
    Differences JPA JMS JDBC JSF JTA CDI JSP EJB Spring •Implicit (CDI) vs. explicit (Spring) blueprint
  • 6.
    Seam-Spring Module A utility library for integrating Spring and CDI programming models Enables the use of Java business components across technology lines
  • 7.
    Seam 3 SpringModule • Seam3 - a library of CDI extensions • Similar functionality to the Seam 2 Spring integration • With CDI specific undertones • Will merge into Apache DeltaSpike
  • 8.
    Seam 3 SpringModule • Seam3 - a library of CDI extensions • Similar functionality to the Seam 2 Spring integration • With CDI specific undertones • Will merge into Apache DeltaSpike + + CDISource DeltaSpike
  • 9.
    Seam 3 Modules • Mail • Solder • Validation • Config • Wicket • Social • Catch • JMS • Remoting • JCR Drools SwitchYard • REST • Security • Faces jBPM Errai • I18N • Spring TBD Ecetera
  • 10.
    Seam 3 Modules DeltaSpike • Mail • Solder • Validation • Config • Wicket • Social • Catch Various JBoss • JMS Projects • Remoting • JCR Drools SwitchYard • REST • Security • Faces jBPM Errai • I18N • Spring TBD Ecetera
  • 11.
    Seam3 Spring Module Design Goals • Minimize changes to existing code • Non-intrusive approach • Highly customizable • Mirror similar capabilities
  • 12.
    Why? • Reuse existinginvestments • Integrate groups with various expertise • Simplify integration of Spring and Java EE • Ease migration of legacy Spring apps to Java EE 6
  • 13.
    Seam 3 SpringModule Features • Integrating Spring components into CDI • Accessing Spring ApplicationContexts • created by the extension -or- • access AC’s created by Spring components (e.g. web ApplicationContext) • Accessing CDI beans • exposing Spring beans as CDI beans
  • 14.
    Integrating Spring intoCDI 1.) Get the ApplicationContext
  • 15.
    Integrating Spring componentsinto CDI Managed Managed • Implemented as a Standard CDI Bean Managed Bean Extension Bean • Spring contexts and Spring beans are installed as CDI beans • ApplicationContexts • Implemented using the resource • Spring Beans producer pattern * Can be bootstrapped or external
  • 16.
    ApplicationContext Management Spring contexts are exposed as CDI beans @Produces @Web @SpringContext ApplicationContext context; Created by Seam Created by Spring Spring Module - or - - @Producer fields e.g. a Web - SPI Based ApplicationContext
  • 17.
    @SpringContext Annotation 1.) BootstrappedBy Spring- CDI Extension @Produces @SpringContext @ApplicationScoped @Configuration (locations={"classpath:springCtx.xml"}) ApplicationContext springContext;
  • 18.
    @SpringContext Annotation 2.) Usedwithin a CDI Managed Bean //Usage @Inject @SpringContext ApplicationContext context;
  • 19.
    @SpringContext Annotation 1.) WebApplication Context (external) // Spring Application Context loaded by // Servlet container @Produces @Web @SpringContext ApplicationContext context;
  • 20.
    Integrating Spring intoCDI 2.) Get access to the Spring Beans
  • 21.
    @SpringContext Annotation 2.) Usewithin a CDI Managed Bean //Usage @Inject @SpringContext ApplicationContext context;
  • 22.
    Spring Bean Producer Applythe resource producer pattern for creating Spring ApplicationContext CDI beans @Produces @SpringBean UserService userService; //Usage @SessionScoped public class AllocationManager { @Inject UserService userService; }
  • 23.
    Avoiding Bean Duplication •ImportedSpring beans may cause duplication issues • CDI will add any classes automatically as beans • Extension-added beans will be in conflict •Options: • Solder @Veto annotation (recommended) • Using side-effects of @Typed and @Alternative (standard-based but we do not recommend) • Proprietary extensions for bean scanning (e.g. Weld)
  • 24.
    Bean Duplication andVetoing Importing beans may result in duplication ... ... but vetoing can solve this problem
  • 25.
    In-Extension Context Bootstrapping •Alternative to @Produces @SpringContext @Configuration •Advantages relative to CDI lifecycle • Spring context is bootstrapped before bean discovery • Spring bean classes are automatically vetoed
  • 26.
  • 27.
    CDI integration intoSpring • Uses standard Spring mechanisms • BeanFactories • BeanPostProcessors/BeanFactoryPostProcessors • Most facilities are hidden behind the <cdi:*/> namespace
  • 28.
    Accessing the BeanManager    <cdi:bean-manager/> •Usage: @Autowired BeanManager beanManager; xmlns:cdi="http://www.jboss.org/schema/seam/spring"
  • 29.
    Accessing CDI Beans <cdi:bean-reference id="user" type="example.User">         <cdi:qualifier type="example.BusinessUser"/> </cdi:bean-reference> @Component  public class User { @Autowired User user; } xmlns:cdi="http://www.jboss.org/schema/seam/spring"
  • 30.
  • 31.
    Scoping •Spring and CDIhave different approaches to bean scoping • Spring - singletons, application-scoped • CDI - prototype, 'default-scoped' •The module preserves the original scope • @SpringContext beans are @ApplicationScoped  • @SpringBean are default-scoped and fall back to the native Spring scope (AOP scope proxy required) • CDI beans are prototype-scoped and fall back to the native CDI scope (through their scoped proxy) 
  • 32.
    Beyond CDI •This modulecan serve as basis for integrating any Java EE component with Spring • EJBs • JAX-RS  • any component that understands CDI
  • 33.
    Roadmap • Current version:3.1.0.Final (included in Seam 3.1.0.Final) • Upcoming versions: o 3.1.x - minor features, bug fixes o 3.2.x (March/April 2012) - additional features  bean autoimport  eventing bridge  bridging Spring AOP/CDI interceptors,decorators  Seam Persistence integration (transactions, Persistence Contexts) • Post 3.2 o integration into Apache DeltaSpike
  • 34.
    ENTERPRISE APPLICATION PLATFORM 6.0 JBoss AS 7.1
  • 35.
    SUBSCRIPTIONS = DEVELOPERPRODUCTIVITY Frees you to focus on the new stuff NOT JUST FOR ADMINS “Q: I’m writing a WS-Policy and...” A C C E L E R AT E KILL YOUR PROJECT! DRUDGERY Fight your bugs, not others’ 33 http://www.redhat.com/jboss/benefits/
  • 36.
    Thank You! Seam 3 Spring Module - http://bit.ly/Seam3Spring Example Code - http://bit.ly/JUDConSeamSpringCode Apache DeltaSpike - http://bit.ly/zsWz2x Ray Ploski Director, Developer Programs & Strategy @rayploski