Date post: | 25-May-2015 |
Category: |
Technology |
Upload: | craig-walls |
View: | 11,495 times |
Download: | 6 times |
What’s New in Spring 3
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Who Am I?
Java, Spring, and OSGi fanatic
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Who Am I?
Java, Spring, and OSGi fanaticPrincipal Consultant with Improving
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Who Am I?
Java, Spring, and OSGi fanaticPrincipal Consultant with Improving
AuthorXDoclet in Action (Manning)
Spring in Action (Manning)
Modular Java (Pragmatic Bookshelf)
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Who Am I?
Java, Spring, and OSGi fanaticPrincipal Consultant with Improving
AuthorXDoclet in Action (Manning)
Spring in Action (Manning)
Modular Java (Pragmatic Bookshelf)
Where we’ve been
Spring: This is your life!
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Evolution of Spring
<bean class="..."></bean>
Spring 1.x
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Evolution of Spring
<bean class="..."></bean>
<tx:/>
Spring 1.x
Spring 2.0
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Evolution of Spring
<bean class="..."></bean>
<tx:/>
Spring 1.x
Spring 2.0
@Component@Autowired
Spring 2.5
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Evolution of Spring
<bean class="..."></bean>
<tx:/>
Spring 1.x
Spring 2.0
@Component@Autowired
Spring 2.5
Spring 3.0?
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Evolution of Spring
<bean class="..."></bean>
<tx:/>
Spring 1.x
Spring 2.0
@Component@Autowired
Spring 2.5
Spring 3.0?
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 1.0
Dependency injection
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 1.0
Dependency injection
POJO-oriented development
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 1.0
Dependency injection
POJO-oriented development
Declarative AOP and transactions
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 1.0
Dependency injection
POJO-oriented development
Declarative AOP and transactions
MVC framework
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 2.0
Problem-specific XML
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 2.0
Problem-specific XML
Extensible configuration
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 2.0
Problem-specific XML
Extensible configuration
Bean scoping
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 2.0
Problem-specific XML
Extensible configuration
Bean scoping
Groovy, JRuby, and BeanShell
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 2.0
Problem-specific XML
Extensible configuration
Bean scoping
Groovy, JRuby, and BeanShell
JSP tag library
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 2.0
Problem-specific XML
Extensible configuration
Bean scoping
Groovy, JRuby, and BeanShell
JSP tag library
Java 5 autoboxing and generics
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 2.5
Annotation-driven wiring
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 2.5
Annotation-driven wiring
Automatic bean configuration
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 2.5
Annotation-driven wiring
Automatic bean configuration
New annotation-driven MVC framework
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 2.5
Annotation-driven wiring
Automatic bean configuration
New annotation-driven MVC framework
JUnit 4-based integration testing
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 1.0
<bean id="linus" class="com.springinaction.peanuts.Linus"> <property name="blanket"> <ref bean="blanket" /> </property></bean>
<bean id="blanket" class="com.springinaction.peanuts.Blanket"> <property name="color"> <value>blue</value> </property></bean>
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 1.1
<bean id="linus" class="com.springinaction.peanuts.Linus"> <property name="blanket" ref="blanket" /></bean>
<bean id="blanket" class="com.springinaction.peanuts.Blanket"> <property name="color" value="blue" /></bean>
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 2.0
<bean id="linus" class="com.springinaction.peanuts.Linus" p:blanket-ref="blanket" />
<bean id="blanket" class="com.springinaction.peanuts.Blanket" p:color="blue" />
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring 2.5
<context:component-scan base-package="com.springinaction.peanuts" />
<bean id="blanket" class="com.springinaction.peanuts.Blanket" p:color="blue" />
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Annotation-Driven Wiring
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Annotation-Driven Wiring
Java:
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Annotation-Driven Wiring@Componentpublic class Linus { @Autowired private Blanket blanket;
public Blanket getBlanket() { return blanket; }}
Java:
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Annotation-Driven Wiring@Componentpublic class Linus { @Autowired private Blanket blanket;
public Blanket getBlanket() { return blanket; }}
Java:
Spring: Context
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Annotation-Driven Wiring@Componentpublic class Linus { @Autowired private Blanket blanket;
public Blanket getBlanket() { return blanket; }}
<context:component-scan base-package="com.springinaction.peanuts" />
Java:
Spring: Context
What’s new in Spring 3?
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring Expression Language
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring Expression Language
Wires values evaluated from expressionsWorks in XML and annotations
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring Expression Language
Wires values evaluated from expressionsWorks in XML and annotations
<bean class="com.springinaction.peanuts.Blanket"> <property name="color" value="#{someOtherBean.color}" /></bean>
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring Expression Language
Wires values evaluated from expressionsWorks in XML and annotations
@Componentpublic class Blanket { @Value("#{someOtherBean.color}") private String color;
public Blanket() { }
// ...}
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Expression variables
Any bean ID
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Expression variables
Any bean IDsystemProperties
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Expression variables
Any bean IDsystemProperties
Scope/Context-specific...contextProperties
contextAttributes
request
session
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
SpEL examplesReferencing bean properties
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
SpEL examplesReferencing bean properties
"#{settingBean.databaseUrl}"
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
SpEL examplesReferencing bean properties
"#{settingBean.databaseUrl}"
Referencing system properties
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
SpEL examplesReferencing bean properties
"#{settingBean.databaseUrl}"
Referencing system properties"#{systemProperties.favoriteColor}"
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
SpEL examplesReferencing bean properties
"#{settingBean.databaseUrl}"
Referencing system properties"#{systemProperties.favoriteColor}"
Evaluating truth
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
SpEL examplesReferencing bean properties
"#{settingBean.databaseUrl}"
Referencing system properties"#{systemProperties.favoriteColor}"
Evaluating truth"#{systemProperties.favoriteColor == 'red'}"
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
SpEL examplesReferencing bean properties
"#{settingBean.databaseUrl}"
Referencing system properties"#{systemProperties.favoriteColor}"
Evaluating truth"#{systemProperties.favoriteColor == 'red'}"
Using static methods
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
SpEL examplesReferencing bean properties
"#{settingBean.databaseUrl}"
Referencing system properties"#{systemProperties.favoriteColor}"
Evaluating truth"#{systemProperties.favoriteColor == 'red'}"
Using static methods"#{T(java.lang.Math).random()}"
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
SpEL examplesReferencing bean properties
"#{settingBean.databaseUrl}"
Referencing system properties"#{systemProperties.favoriteColor}"
Evaluating truth"#{systemProperties.favoriteColor == 'red'}"
Using static methods"#{T(java.lang.Math).random()}"
Templated Strings
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
SpEL examplesReferencing bean properties
"#{settingBean.databaseUrl}"
Referencing system properties"#{systemProperties.favoriteColor}"
Evaluating truth"#{systemProperties.favoriteColor == 'red'}"
Using static methods"#{T(java.lang.Math).random()}"
Templated Strings"The time is #{T(java.lang.System).currentTimeMillis()}"
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
One more SpEL example
Collection projection
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
One more SpEL example
Collection projection"#{snoopyPersonas.![name]}"
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
@PathVariable
Spring 2.5:@Controllerpublic class SpittleListController { @RequestMapping("/spittleList.htm") public String displaySpittleList(@RequestParam("username") String userName) { // ... return "spittleList"; }}
http://localhost:8080/spitter/spittleList.htm?username=habuma
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
@PathVariable
Spring 3.0:@Controllerpublic class SpittleListController { @RequestMapping("/{username}/list") public String displaySpittleList(@PathVariable("username") String userName) { // ... return "spittleList"; }}
http://localhost:8080/spitter/habuma/list
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
@RequestHeader
Spring 2.5:@Controllerpublic class HomeController { @RequestMapping("/home") public String displayHomePage(HttpServletRequest request) { String userAgent = request.getHeader("User-Agent"); // ... return "home"; }}
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
@RequestHeader
Spring 3.0:@Controllerpublic class HomeController { @RequestMapping("/home") public String displayHomePage(@RequestHeader("User-Agent") String userAgent) { // ... return "home"; }}
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
@CookieValue
Spring 2.5:@Controllerpublic class HomeController { @RequestMapping("/home") public String displayHomePage(HttpServletRequest request) { String lastVisit = "never"; Cookie[] cookies = request.getCookies(); for (Cookie cookie : cookies) { if("LastVisit".equals(cookie.getName())) { lastVisit = cookie.getValue(); } } // ... return "home"; }}
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
@CookieValue
Spring 3.0:@Controllerpublic class HomeController { @RequestMapping("/home") public String displayHomePage(@CookieValue("LastVisit") String lastVisit) { // ... return "home"; }}
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
default values
New for @RequestParam@RequestParam(value="productId", defaultValue="1234") String productId
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
default values
New for @RequestParam@RequestParam(value="productId", defaultValue="1234") String productId
Standard issue for @RequestHeader and @CookieValue
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
default values
New for @RequestParam@RequestParam(value="productId", defaultValue="1234") String productId
Standard issue for @RequestHeader and @CookieValue
@RequestHeader(value="User-Agent", defaultValue="1234") String userAgent
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
default values
New for @RequestParam@RequestParam(value="productId", defaultValue="1234") String productId
Standard issue for @RequestHeader and @CookieValue
@RequestHeader(value="User-Agent", defaultValue="1234") String userAgent
@CookieValue(value="LastVisit", defaultValue="1234") String lastVisit
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
<spring:url>
New JSP tagGenerates context-senstive URL
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
<spring:url>
New JSP tagGenerates context-senstive URL
<spring:url value="/spittle/{id}/edit" var="editUrl" escapeXml="true"> <spring:param name="id" value="${spittle.id}" /></spring:url>
<a href="${editUrl}">Do something</a>
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Declarative Validation
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Declarative Validation
Based on JSR-303 validators
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Declarative Validation
Based on JSR-303 validators
Hibernate Validator as default implementation
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Declarative Validation
Based on JSR-303 validators
Hibernate Validator as default implementation
Primarily used to validate inputs to Spring MVC controllers
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Declarative Validation
Based on JSR-303 validators
Hibernate Validator as default implementation
Primarily used to validate inputs to Spring MVC controllers
Configured automatically with <mvc:annotation-driven/>
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
More on validation
@RequestMapping(method=POST) public String addSpittle( @Valid Spittle spittle, BindingResult result) { if(result.hasErrors()) { return "spittle/form"; } spitterService.addSpittle(spittle); return "redirect:/home"; }
In Spring MVCcontroller
@Column(name="spittleText") @NotNull @Size(min=1, max=140) public String getText() { return this.text; }
In entityclass
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
ETag Support
ShallowEtagHeaderFilter
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
ETag Support
<filter> <filter-name>etagFilter</filter-name> <filter-class> org.springframework.web.filter.ShallowEtagHeaderFilter </filter-class> </filter> <filter-mapping> <filter-name>etagFilter</filter-name> <servlet-name>spitter</servlet-name> </filter-mapping>
ShallowEtagHeaderFilter
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
ETag Support
<filter> <filter-name>etagFilter</filter-name> <filter-class> org.springframework.web.filter.ShallowEtagHeaderFilter </filter-class> </filter> <filter-mapping> <filter-name>etagFilter</filter-name> <servlet-name>spitter</servlet-name> </filter-mapping>
ShallowEtagHeaderFilter
Returns HTTP 304 if content is unmodifiedif-none-match
(MD5 Hash comparison)
Saves bandwidth
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
HTTP Method Conversion
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
HTTP Method ConversionHTTP defines four methods:
GET, POST, DELETE, and PUT
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
HTTP Method ConversionHTTP defines four methods:
GET, POST, DELETE, and PUTHTML only supports 2:
GET and POST
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
HTTP Method ConversionHTTP defines four methods:
GET, POST, DELETE, and PUTHTML only supports 2:
GET and POSTSpring 3’s HiddenHttpMethodFilter fixes that
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
HTTP Method ConversionHTTP defines four methods:
GET, POST, DELETE, and PUTHTML only supports 2:
GET and POSTSpring 3’s HiddenHttpMethodFilter fixes that
<filter> <filter-name>hiddenMethodFilter</filter-name> <filter-class> org.springframework.web.filter.HiddenHttpMethodFilter </filter-class> </filter> <filter-mapping> <filter-name>hiddenMethodFilter</filter-name> <servlet-name>spitter</servlet-name> </filter-mapping>
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
HTTP Methods in Spring MVC
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
HTTP Methods in Spring MVC
Spring MVC form tags support hidden HTTP methods
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
HTTP Methods in Spring MVC
Spring MVC form tags support hidden HTTP methods
<form:form method="delete"> <p class="submit"><input type="submit" value="Delete Spittle"/></p></form:form>
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
HTTP Methods in Spring MVC
Spring MVC form tags support hidden HTTP methods
<form:form method="delete"> <p class="submit"><input type="submit" value="Delete Spittle"/></p></form:form>
Controllers can handle all HTTP methods
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
HTTP Methods in Spring MVC
Spring MVC form tags support hidden HTTP methods
<form:form method="delete"> <p class="submit"><input type="submit" value="Delete Spittle"/></p></form:form>
Controllers can handle all HTTP methods@RequestMapping(method = RequestMethod.DELETE)public String deleteSpittle(@PathVariable long spittleId) { spittleService.deleteSpittle(spittleId); return "redirect:/home";}
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Content negotiation
ContentNegotiatingViewResolverChooses a view based on HTTP Accepts header, JAF
content type, format parameter, or request path extension
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Content negotiation
ContentNegotiatingViewResolverChooses a view based on HTTP Accepts header, JAF
content type, format parameter, or request path extension
New view resolversAbstractAtomFeedViewAbstractRssFeedView
MarshallingViewMappingJacksonJsonView
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
REST consumption
New RestTemplate
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
REST consumption
New RestTemplate
ReadRestTemplate template = new RestTemplate();template.getForObject("http://localhost:8080/spitter/users/${id}", String.class, userId);
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
REST consumption
New RestTemplate
ReadRestTemplate template = new RestTemplate();template.getForObject("http://localhost:8080/spitter/users/${id}", String.class, userId);
Create RestTemplate template = new RestTemplate();SpitterUser user = new SpitterUser(userName, password);template.postForLocation("http://localhost:8080/spitter/users/${id}", user, userId);
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
REST consumption
New RestTemplate
ReadRestTemplate template = new RestTemplate();template.getForObject("http://localhost:8080/spitter/users/${id}", String.class, userId);
Delete RestTemplate template = new RestTemplate();template.delete("http://localhost:8080/spitter/users/${id}", userId);
Create RestTemplate template = new RestTemplate();SpitterUser user = new SpitterUser(userName, password);template.postForLocation("http://localhost:8080/spitter/users/${id}", user, userId);
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
JavaConfig@Configurationpublic class PeanutsConfiguration {
@Bean public Linus linus() { Linus linus = new Linus(); linus.setBlanket(blanket()); return linus; } @Bean private Blanket blanket() { Blanket blanket = new Blanket(); blanket.setColor("blue"); return blanket; }}
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
JavaConfig in Components
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
JavaConfig in Components
@Componentpublic class KiteEatingTree implements DeciduousTree {
public void shedLeaves() { // ... }
@Bean public Kite kite() { return new Kite(); }}
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Asynchronous Methods
@Asyncpublic void backgroundJob(){ ... }
Annotate a bean method
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Asynchronous Methods
@Asyncpublic void backgroundJob(){ ... }
<task:annotation-driven/>
Annotate a bean method
In Spring configuration:
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Scheduling
@Scheduled(fixedDelay=3000L) public void ping() { ... }
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Scheduling
@Scheduled(fixedDelay=3000L) public void ping() { ... }
@Scheduled(fixedRate=3000L) public void ping() { ... }
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Scheduling
@Scheduled(fixedDelay=3000L) public void ping() { ... }
@Scheduled(fixedRate=3000L) public void ping() { ... }
@Scheduled(cron="0 0 0 * * SAT) public void ping() { ... }
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Miscellaneous
Object-to-XML mapping from Spring-WS
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Miscellaneous
Object-to-XML mapping from Spring-WSEmbracing Java 5 (generics, autoboxing,
annotations, etc).
What’s going away
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Bye bye
Spring MVC controller hierarchy (deprecated)
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Bye bye
Spring MVC controller hierarchy (deprecated)
JUnit 3 testing
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Bye bye
Spring MVC controller hierarchy (deprecated)
JUnit 3 testingCommons Attributes
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Bye bye
Spring MVC controller hierarchy (deprecated)
JUnit 3 testingCommons Attributes
Native TopLink support
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Bye bye
Spring MVC controller hierarchy (deprecated)
JUnit 3 testingCommons Attributes
Native TopLink supportWebLogic 8.1 and WebSphere 5.1
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Bye bye
Spring MVC controller hierarchy (deprecated)
JUnit 3 testingCommons Attributes
Native TopLink supportWebLogic 8.1 and WebSphere 5.1
spring.jar
What else?
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Keep your eye on...
Spring Web Flow 2.0
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Keep your eye on...
Spring Web Flow 2.0Spring BlazeDS
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Keep your eye on...
Spring Web Flow 2.0Spring BlazeDS
Spring Security 3.0
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Keep your eye on...
Spring Web Flow 2.0Spring BlazeDS
Spring Security 3.0Spring Dynamic Modules (Spring-DM)
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Keep your eye on...
Spring Web Flow 2.0Spring BlazeDS
Spring Security 3.0Spring Dynamic Modules (Spring-DM)
SpringSource dm Server
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Keep your eye on...
Spring Web Flow 2.0Spring BlazeDS
Spring Security 3.0Spring Dynamic Modules (Spring-DM)
SpringSource dm ServerSpringSource tc Server
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Keep your eye on...
Spring Web Flow 2.0Spring BlazeDS
Spring Security 3.0Spring Dynamic Modules (Spring-DM)
SpringSource dm ServerSpringSource tc Server
Roo
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Keep your eye on...
Spring Web Flow 2.0Spring BlazeDS
Spring Security 3.0Spring Dynamic Modules (Spring-DM)
SpringSource dm ServerSpringSource tc Server
RooGroovy/Grails
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Keep your eye on...
Spring Web Flow 2.0Spring BlazeDS
Spring Security 3.0Spring Dynamic Modules (Spring-DM)
SpringSource dm ServerSpringSource tc Server
RooGroovy/Grails
SpringSource Tool Suite
In summary...
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring simplifies
Spring’s initial focus was to simplify enterprise Java
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring simplifies
Spring’s initial focus was to simplify enterprise Java
Now simplification efforts turn inward
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring simplifies
Spring’s initial focus was to simplify enterprise Java
Now simplification efforts turn inwardTrending away from XML toward annotations
E-mail: [email protected] Blog: http://www.springinaction.com Twitter: habuma
Spring simplifies
Spring’s initial focus was to simplify enterprise Java
Now simplification efforts turn inwardTrending away from XML toward annotations
All the while, offering more power
Thank You
Don’t forget the evals!