What's new in Spring 3?

Post on 25-May-2015

11.490 views 6 download

Tags:

description

Craig Walls' presentation on what's to come in Spring 3 as given at Dallas Tech Fest 2009 in Frisco, TX, June 19, 2009.

Transcript of What's new in Spring 3?

What’s New in Spring 3

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Who Am I?

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Who Am I?

Java, Spring, and OSGi fanatic

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Who Am I?

Java, Spring, and OSGi fanaticPrincipal Consultant with Improving

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Evolution of Spring

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Evolution of Spring

<bean class="..."></bean>

Spring 1.x

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Evolution of Spring

<bean class="..."></bean>

<tx:/>

Spring 1.x

Spring 2.0

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 1.0

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 1.0

Dependency injection

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 1.0

Dependency injection

POJO-oriented development

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 1.0

Dependency injection

POJO-oriented development

Declarative AOP and transactions

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 1.0

Dependency injection

POJO-oriented development

Declarative AOP and transactions

MVC framework

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 2.0

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 2.0

Problem-specific XML

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 2.0

Problem-specific XML

Extensible configuration

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 2.0

Problem-specific XML

Extensible configuration

Bean scoping

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 2.0

Problem-specific XML

Extensible configuration

Bean scoping

Groovy, JRuby, and BeanShell

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 2.5

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 2.5

Annotation-driven wiring

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 2.5

Annotation-driven wiring

Automatic bean configuration

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 2.5

Annotation-driven wiring

Automatic bean configuration

New annotation-driven MVC framework

E-mail: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 1.0

E-mail: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 1.1

E-mail: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 2.0

E-mail: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring 2.5

E-mail: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Annotation-Driven Wiring

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Annotation-Driven Wiring

Java:

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring Expression Language

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring Expression Language

Wires values evaluated from expressionsWorks in XML and annotations

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Expression variables

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Expression variables

Any bean ID

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Expression variables

Any bean IDsystemProperties

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Expression variables

Any bean IDsystemProperties

Scope/Context-specific...contextProperties

contextAttributes

request

session

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

SpEL examples

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

SpEL examplesReferencing bean properties

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

SpEL examplesReferencing bean properties

"#{settingBean.databaseUrl}"

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

SpEL examplesReferencing bean properties

"#{settingBean.databaseUrl}"

Referencing system properties

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

SpEL examplesReferencing bean properties

"#{settingBean.databaseUrl}"

Referencing system properties"#{systemProperties.favoriteColor}"

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

SpEL examplesReferencing bean properties

"#{settingBean.databaseUrl}"

Referencing system properties"#{systemProperties.favoriteColor}"

Evaluating truth

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

One more SpEL example

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

One more SpEL example

Collection projection

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

One more SpEL example

Collection projection"#{snoopyPersonas.![name]}"

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

@PathVariable

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

@RequestHeader

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

@CookieValue

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

default values

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

default values

New for @RequestParam@RequestParam(value="productId", defaultValue="1234") String productId

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

<spring:url>

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

<spring:url>

New JSP tagGenerates context-senstive URL

E-mail: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Declarative Validation

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Declarative Validation

Based on JSR-303 validators

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Declarative Validation

Based on JSR-303 validators

Hibernate Validator as default implementation

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

ETag Support

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

ETag Support

ShallowEtagHeaderFilter

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

HTTP Method Conversion

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

HTTP Method ConversionHTTP defines four methods:

GET, POST, DELETE, and PUT

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

HTTP Methods in Spring MVC

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

HTTP Methods in Spring MVC

Spring MVC form tags support hidden HTTP methods

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Content negotiation

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

REST consumption

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

REST consumption

New RestTemplate

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

JavaConfig

E-mail: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

JavaConfig in Components

E-mail: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Asynchronous Methods

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Asynchronous Methods

@Asyncpublic void backgroundJob(){ ... }

Annotate a bean method

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Asynchronous Methods

@Asyncpublic void backgroundJob(){ ... }

<task:annotation-driven/>

Annotate a bean method

In Spring configuration:

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Scheduling

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Scheduling

@Scheduled(fixedDelay=3000L) public void ping() { ... }

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Scheduling

@Scheduled(fixedDelay=3000L) public void ping() { ... }

@Scheduled(fixedRate=3000L) public void ping() { ... }

E-mail: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Miscellaneous

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Miscellaneous

Object-to-XML mapping from Spring-WS

E-mail: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Bye bye

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Bye bye

Spring MVC controller hierarchy (deprecated)

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Bye bye

Spring MVC controller hierarchy (deprecated)

JUnit 3 testing

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Bye bye

Spring MVC controller hierarchy (deprecated)

JUnit 3 testingCommons Attributes

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Bye bye

Spring MVC controller hierarchy (deprecated)

JUnit 3 testingCommons Attributes

Native TopLink support

E-mail: craig@habuma.com 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: craig@habuma.com 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

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Bye bye

What else?

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Keep your eye on...

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Keep your eye on...

Spring Web Flow 2.0

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Keep your eye on...

Spring Web Flow 2.0Spring BlazeDS

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Keep your eye on...

Spring Web Flow 2.0Spring BlazeDS

Spring Security 3.0

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring simplifies

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring simplifies

Spring’s initial focus was to simplify enterprise Java

E-mail: craig@habuma.com 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: craig@habuma.com 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: craig@habuma.com 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

E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma

Spring simplifies

Thank You

Don’t forget the evals!