craig walls - effective spring
TRANSCRIPT
-
7/30/2019 Craig Walls - Effective Spring
1/62
Craig Walls
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