spring design-juergen-qcon

Post on 21-Jan-2015

672 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

© 2010 SpringSource, A division of VMware. All rights reserved

CONFIDENTIAL

© 2010 SpringSource, A division of VMware. All rights reserved

CONFIDENTIAL

Modern Component Design with Spring 3

Jürgen Höller, Principal Engineer, SpringSource

2CONFIDENTIAL 2CONFIDENTIAL

Spring 3.0 – Component Model Revisited

Powerful annotated component model• stereotypes, factory methods, JSR-330

Spring Expression Language• Unified EL++

Comprehensive REST support• and other Spring @MVC additions

Support for Portlet 2.0 request types• action/render/event/resource mappings

Declarative validation and formatting• integration with JSR-303 Bean Validation

Scheduling enhancements• scheduling annotation with cron support

3CONFIDENTIAL 3CONFIDENTIAL

Enhanced Stereotype Model

Powerful options for custom annotations• combining meta-annotations e.g. on stereotype• automatically detected (no configuration necessary!)

@Service@Scope("request")@Transactional(rollbackFor=Exception.class)@Retention(RetentionPolicy.RUNTIME)public @interface MyService {}

@MyServicepublic class BookAdminService { …}

4CONFIDENTIAL 4CONFIDENTIAL

Annotated Factory Methods

Spring 3.0 includes the core functionality of the formerSpring JavaConfig project• configuration classes defining managed beans• common handling of annotated factory methods

@Bean @Primary @Lazypublic BookAdminService bookAdminService() { MyBookAdminService service = new MyBookAdminService(); service.setDataSource(…); return service;}

5CONFIDENTIAL 5CONFIDENTIAL

Standardized Annotations

@ManagedBeanpublic class MyBookAdminService implements BookAdminService {

@Inject public MyBookAdminService(AccountRepository ar) { … }

@TransactionAttribute public BookUpdate updateBook(Addendum addendum) { … }}

6CONFIDENTIAL 6CONFIDENTIAL

JSR-330 and Co

@javax.inject.Inject is part of JSR-330• "Dependency Injection for Java"• also defines @Qualifier semantics• and a Provider interface

@javax.annotation.ManagedBean is part of JSR-250 v1.1• driven by the Java EE 6 specification• can be detected through classpath scanning

@javax.ejb.TransactionAttribute is part of the EJB 3.0/3.1 specification• also supported for Spring beans

7CONFIDENTIAL 7CONFIDENTIAL

EL in XML Bean Definitions

<bean class="mycompany.BookTestDatabase">

<property name="databaseName" value="#{systemProperties.databaseName}"/>

<property name="keyGenerator" value="#{strategyBean.databaseKeyGenerator}"/>

</bean>

8CONFIDENTIAL 8CONFIDENTIAL

EL in Component Annotations

@Repositorypublic class BookTestDatabase {

@Value("#{systemProperties.databaseName}") public void setDatabaseName(String dbName) { … }

@Value("#{strategyBean.databaseKeyGenerator}") public void setKeyGenerator(KeyGenerator kg) { … }

}

9CONFIDENTIAL 9CONFIDENTIAL

@RequestMapping(value = "/books/{id}", method = GET)public Book findBook(@PathVariable("id") long id) { return this.bookAdminService.findBook(id);}

http://mybookstore.com/books/12345

REST in MVC - @PathVariable

10CONFIDENTIAL 10CONFIDENTIAL

Portlet 2.0 Support in MVC@Controller@RequestMapping("EDIT")public class MyPortletController {

@ActionMapping("delete") public void removeBook(@RequestParam("book") String bookId) { this.myService.deleteBook(bookId); }

@EventMapping("BookUpdate") public void updateBook(BookUpdateEvent bookUpdate) { // extract book entity data from event payload object

this.myService.updateBook(…); }}

11CONFIDENTIAL 11CONFIDENTIAL

Declarative Model Validationpublic class Book { @NotNull @Past private Date releaseDate;}

@RequestMapping("/books/new")public void newBook(@Valid Book book) { … }

JSR-303 "Bean Validation" as the common ground

Spring 3.0 fully supports JSR-303 for MVC data binding

Same metadata can be used for persisting, rendering, etc

12CONFIDENTIAL 12CONFIDENTIAL

Conversion and Formatting

Spring 3.0 features a revised binding and type conversion infrastructure• stateless Java 5+ type converters and formatters• annotation-driven number/date formatting

public class Book { @NotNull @Past @DateTimeFormat(iso=ISO.DATE) private Date releaseDate;}

13CONFIDENTIAL 13CONFIDENTIAL

Scheduling Enhancements

Spring 3.0 introduces a major overhaul of the scheduling package• TaskScheduler interface with Trigger abstraction• XML scheduling namespace with cron support• @Async annotation for asynchronous user methods• @Scheduled annotation for cron-triggered methods

@Scheduled(cron = "0 0 12 * * ?")public void performTempFileCleanup() { ...}

14CONFIDENTIAL 14CONFIDENTIAL

Related Java EE 6 Specifications

Java EE 6 API support in Spring Framework 3.0• several specifications adopted into the Spring component model

Integration with JPA 2.0• support for query builder, native delegates, etc

Integration with JSF 2.0• full compatibility as a managed bean facility

JSR-303 Bean Validation integration• through Hibernate Validator 4.1

JSR-330: common dependency injection annotations• natively supported by Spring itself

15CONFIDENTIAL 15CONFIDENTIAL

Spring 3.1 – Component Model Enhancements

Environment profiles for bean definitions Java-based application configuration "c:" namespace for XML configuration Declarative caching

16CONFIDENTIAL 16CONFIDENTIAL

Environment Profiles<beans profile="production"><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClass" value="${database.driver}"/><property name="jdbcUrl" value="${database.url}"/><property name="username" value="${database.username}"/><property name="password" value="${database.password}"/>

</bean></beans>

<beans profile="embedded"><jdbc:embedded-database id="dataSource" type="H2"><jdbc:script location="/WEB-INF/database/schema-member.sql"/><jdbc:script location="/WEB-INF/database/schema-activity.sql"/><jdbc:script location="/WEB-INF/database/schema-event.sql"/><jdbc:script location="/WEB-INF/database/data.sql"/>

</jdbc:embedded-database></beans>

17CONFIDENTIAL 17CONFIDENTIAL

Environment Configuration

Environment association of specific bean definitions• XML 'profile' attribute on <beans> element• @Profile annotation on configuration classes• @Profile annotation on individual component classes

Activating specific profiles by name• e.g. through a system property

• -Dspring.profiles.active=development

• or other means outside of the deployment unit• according to environment conventions

Ideally: no need to touch deployment unit across different stages/environments

18CONFIDENTIAL 18CONFIDENTIAL

Java-Based Application Configuration@FeatureConfiguration@Import(DataConfig.class)public class TxFeatures { @Feature public TxAnnotationDriven tx(DataConfig dataConfig) { return new TxAnnotationDriven(dataConfig.txManager()).proxyTargetClass(true); }}

@Configurationpublic class DataConfig { @Bean public PlatformTransactionManager txManager() { return new DataSourceTransactionManager(dataSource()); }

@Bean public DataSource dataSource() { // ... configure and return JDBC DataSource ... }}

<tx:annotation-driven transaction-manager="txManager"proxy-target-class="true"/>

19CONFIDENTIAL 19CONFIDENTIAL

"c:" Namespace for XML Configuration

New XML namespace for use with bean configuration• shortcut for <constructor-arg>

• inline argument values• analogous to existing "p:" namespace

• use of constructor argument names• recommended for readability • debug symbols have to be available in the application's class files

<bean class="…" c:age="10" c:name="myName"/>

<bean class="…" c:name-ref="nameBean"c:spouse-ref="spouseBean"/>

20CONFIDENTIAL 20CONFIDENTIAL

Declarative Caching@Cacheablepublic Owner loadOwner(int id);

@Cacheable(condition="name.length < 10")public Owner loadOwner(String name);

@CacheEvictpublic void deleteOwner(int id);

21CONFIDENTIAL 21CONFIDENTIAL

Summary

Spring 3 provides plenty of features for modern component design• focus on annotation-based components• also investing into concise XML-based bean definitions

Selected core Spring 3.0 features• stereotypes, factory methods, EL• support for standardized annotations• declarative validation and formatting

Selected enhancements in Spring 3.1• environment profiles for bean definitions• Java-based application configuration• declarative caching

杭州站 · 2011年10月20日~22日 www.qconhangzhou.com(6月启动)

QCon北京站官方网站和资料下载 www.qconbeijing.com

top related