Craig Walls - Effective Spring

  • Upload
    illogix

  • View
    217

  • Download
    0

Embed Size (px)

Citation preview

  • 7/30/2019 Craig Walls - Effective Spring

    1/62

    Craig Walls

    [email protected]

    Twitter: @habuma

    http://github.com/habuma

    Effective Spring

    http://github.com/habumahttp://github.com/habumahttp://github.com/habuma
  • 7/30/2019 Craig Walls - Effective Spring

    2/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Who am I?

    Java and Spring Fanatic

    Senior Engineer with SpringSource

    Spring Social Project Lead

    Author

    Mayor of Post Office,Jal NM on Foursquare

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    3/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Recommendations != Best Practices

    The code is more what youd call guidelines than actual rules.- Captain Hector Barbossa, Pirates of the Caribbean: The Curse of the Black Pearl

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    4/62

    Consider merging web application contexts

  • 7/30/2019 Craig Walls - Effective Spring

    5/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    A Tale of Two Contexts

    DispatcherServlet creates an application context

    So does ContextLoaderListener

    DispatcherServlet can see ContextLoaderListeners beans

    ContextLoaderListener cannot see DispatcherServlets beans

    Confusing, unnecessary, and complicates some things (security)

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    6/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Solution: Put all beans in one context

    Configure DispatcherServlet to load an empty context

    Configure ContextLoaderListener to load all beans

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    7/62Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Empty DispatcherServlet Context

    DispatcherServlet loads an empty application context

    http://github.com/habuma/sampleshttp://web.servlet.dispatcherservlet/http://web.servlet.dispatcherservlet/http://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    8/62Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Simple ContextLoaderListener Config

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    9/62Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Simple ContextLoaderListener Config

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    10/62

    Consider using Springs Java-based configurationover XML configuration

  • 7/30/2019 Craig Walls - Effective Spring

    11/62Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    The Curse of the Angle-Bracket

    Not type-safe

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    12/62Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    The Curse of the Angle-Bracket

    Not refactor-friendly

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    13/62Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    The Curse of the Angle-Bracket

    XML namespace URIs impossible to remember

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    14/62Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    The Curse of the Angle-Bracket

    Verbose

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    15/62Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    More Trouble with XML Config

    Not easy to do smart configuration

    Not easy to test configuration

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    16/62Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Springs Java Configuration

    Type-safe

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    17/62Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Springs Java Configuration

    As refactorable as any Java code

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    18/62Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Springs Java Configuration

    @Configuration is easy to remember(@Component also works)

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    19/62Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Springs Java Configuration

    Still verbose?

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    20/62Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Springs Java Configuration

    Smart Configuration

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    21/62Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Springs Java Configuration

    Smart Configuration

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    22/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Springs Java Configuration

    Smart Configuration

    B h b XML ?

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    23/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    But what about XML namespaces?

    @E bl A

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    24/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    @Enable Annotations

    (Spring 3.1.0 and up)

    Oh h

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    25/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Oh yeah...component-scanning

    ...becomes...

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    26/62

    Favor component-scanning and autowiring overexplicit configuration

    C S i

  • 7/30/2019 Craig Walls - Effective Spring

    27/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Component Scanning

    or

    Scans package(s) for @Component classes

    Automatically creates beans in Spring

    A i i

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    28/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Auto-wiring

    Component-scanning also includes auto-wiring (by type)

    JSR-330 @Inject also supported

    V b i i MVC C fi i

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    29/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Verbosity in MVC Configuration

    A i S i MVC C ll

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    30/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Annotating Spring MVC Controllers

    @Controller is a specialized @Component(and is picked up by component-scanning)

    C i C ll

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    31/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Component-scanning Controllers

    or

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    32/62

    Consider using Spring 3.1 profiles to handleenvironment-specific details

    Diff t B f Diff t E

  • 7/30/2019 Craig Walls - Effective Spring

    33/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Different Beans for Different Envs

    Diff t B f Diff t E

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    34/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Different Beans for Different Envs

    S l ti ?

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    35/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Solution?

    Pick a different set of Spring configs atbuild-time, of course!

    B tt S l ti

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    36/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Better Solution

    B tt S l ti

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    37/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Better Solution

    Acti atin Profiles

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    38/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Activating Profiles

    spring.profiles.active and spring.profiles.default

    In web.xml

    ...or as a system environment variable, JVM systemproperty, or an entry in JNDI

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    39/62

    Consider using Spring Data JPA to createrepositories instead of writing them yourself

    Ever Written This?

  • 7/30/2019 Craig Walls - Effective Spring

    40/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Ever Written This?

    Ever Written This?

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    41/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Ever Written This?

    Stop Writing Boilerplate Repositories!

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    42/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Stop Writing Boilerplate Repositories!

    Let Spring Data JPA Handle It

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    43/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Let Spring Data JPA Handle It

    Step 1: Add Spring Data JPA to your project

    Maven

    Gradle

    Let Spring Data JPA Handle It

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    44/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Let Spring Data JPA Handle It

    Step 2: Add Spring Data JPA to your Spring config

    Let Spring Data JPA Handle It

    http://github.com/habuma/sampleshttp://www.springframework.org/schema/data/jpahttp://www.springframework.org/schema/data/jpahttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beanshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    45/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Let Spring Data JPA Handle It

    Step 3: Write your repository interface

    Let Spring Data JPA Handle It

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    46/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Let Spring Data JPA Handle It

    Step 4: There is no step 4

    No really...thats all there is to it

    Just inject and use...

    By the way

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    47/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    By the way...

    Spring Data also does NoSQL(Neo4j, MongoDB, CouchDB, etc, etc)

    More on that in a different session

    Back to Step 3

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    48/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Back to Step 3

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    49/62

    Consider using SpringJUnit4TestRunner tointegration-test your beans

    Testing With and Without Spring

  • 7/30/2019 Craig Walls - Effective Spring

    50/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Testing With and Without Spring

    Two kinds of testing...

    Unit-testing (Spring-supported, not Spring-involved)

    Integration-testing (Spring-supported, Spring-involved)

    How Not to Write Spring Tests

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    51/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    How Not to Write Spring Tests

    HowYou Should Write Spring Tests

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    52/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    How You Should Write Spring Tests

    HowYou Should Write Spring Tests

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    53/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    How You Should Write Spring Tests

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    54/62

    Consider using Spring Test MVC to testcontrollers

    Testing @Controllers as POJOs

  • 7/30/2019 Craig Walls - Effective Spring

    55/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Testing @Controllers as POJOs

    Testing @Controllers as POJOs

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    56/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Testing @Controllers as POJOs

    Only tests whats inside the handler method

    Testing @Controllers as Controllers

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    57/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Testing @Controllers as Controllers

    Tests Spring MVC stuffandmethod internals

    Spring Test MVC

    http://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://github.com/habuma/sampleshttp://repo.springsource.org/milestone
  • 7/30/2019 Craig Walls - Effective Spring

    58/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Spring Test MVC

    https://github.com/SpringSource/spring-test-mvc

    Maven

    Gradle

    In Springs milestone repositoryhttp://repo.springsource.org/milestone

    http://github.com/habuma/sampleshttp://repo.springsource.org/milestonehttp://repo.springsource.org/milestonehttp://repo.springsource.org/milestonehttp://repo.springsource.org/milestonehttp://repo.springsource.org/milestonehttp://repo.springsource.org/milestonehttps://github.com/SpringSource/spring-test-mvchttps://github.com/SpringSource/spring-test-mvchttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    59/62

    Consider using Spring Test MVC to test RESTclient code

    Heres the problem

  • 7/30/2019 Craig Walls - Effective Spring

    60/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Here s the problem...

    How can I test this...

    ...without hitting the real Facebook Graph API?

    Solution: Mock the Server

    http://github.com/habuma/sampleshttps://graph.facebook.com/coca-colahttps://graph.facebook.com/coca-colahttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    61/62

    Email: [email protected] Twitter: @habuma Blog: http://www.springinaction.com Sample Code: http://github.com/habuma

    Solution: Mock the Server

    http://github.com/habuma/sampleshttp://graph.facebook.com/coca-colahttp://graph.facebook.com/coca-colahttp://github.com/habuma/sampleshttp://github.com/habuma/samples
  • 7/30/2019 Craig Walls - Effective Spring

    62/62

    Q & A