spring 4.3-component-design

28
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 1 Modern Java Component Design with Spring Framework 4.3 Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Juergen Hoeller Spring Framework Lead Pivotal

Upload: grzegorz-duda

Post on 17-Feb-2017

217 views

Category:

Software


9 download

TRANSCRIPT

Page 1: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/1

Modern Java Component Designwith Spring Framework 4.3

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/

Juergen HoellerSpring Framework Lead

Pivotal

Page 2: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/2

The State of the Art: Component Classes

@Service

@Lazy

public class MyBookAdminService implements BookAdminService {

// @Autowired

public MyBookAdminService(AccountRepository repo) {

...

}

@Transactional

public BookUpdate updateBook(Addendum addendum) {

...

}

}

Page 3: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/3

Composable Annotations

@Service

@Scope("session")

@Primary

@Transactional(rollbackFor=Exception.class)

@Retention(RetentionPolicy.RUNTIME)

public @interface MyService {}

@MyService

public class MyBookAdminService {

...

}

Page 4: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/4

Composable Annotations with Overridable Attributes

@Scope(scopeName="session")

@Retention(RetentionPolicy.RUNTIME)

public @interface MySessionScoped {

@AliasFor(annotation=Scope.class, attribute="proxyMode")

ScopedProxyMode mode() default ScopedProxyMode.NO;

}

@Transactional(rollbackFor=Exception.class)

@Retention(RetentionPolicy.RUNTIME)

public @interface MyTransactional {

@AliasFor(annotation=Transactional.class)

boolean readOnly();

}

Page 5: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/5

Convenient Scoping Annotations (out of the box)

■ Web scoping annotations coming with Spring Framework 4.3

● @RequestScope

● @SessionScope

● @ApplicationScope

■ Special-purpose scoping annotations across the Spring portfolio

● @RefreshScope

● @JobScope

● @StepScope

Page 6: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/6

The State of the Art: Configuration Classes

@Configuration

@Profile("standalone")

@EnableTransactionManagement

public class MyBookAdminConfig {

@Bean

public BookAdminService myBookAdminService() {

MyBookAdminService service = new MyBookAdminService();

service.setDataSource(bookAdminDataSource());

return service;

}

@Bean

public BookAdminService bookAdminDataSource() {

...

}

}

Page 7: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/7

Configuration Classes with Autowired Bean Methods

@Configuration

@Profile("standalone")

@EnableTransactionManagement

public class MyBookAdminConfig {

@Bean

public BookAdminService myBookAdminService( DataSource bookAdminDataSource) {

MyBookAdminService service = new MyBookAdminService();

service.setDataSource(bookAdminDataSource);

return service;

}

}

Page 8: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/8

Configuration Classes with Autowired Constructors

@Configuration

public class MyBookAdminConfig {

private final DataSource bookAdminDataSource;

// @Autowired

public MyBookAdminService(DataSource bookAdminDataSource) {

this.bookAdminDataSource = bookAdminDataSource;

}

@Bean

public BookAdminService myBookAdminService() {

MyBookAdminService service = new MyBookAdminService();

service.setDataSource(this.bookAdminDataSource);

return service;

}

}

Page 9: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/9

Configuration Classes with Base Classes

@Configuration

public class MyApplicationConfig extends MyBookAdminConfig {

...

}

public class MyBookAdminConfig {

@Bean

public BookAdminService myBookAdminService() {

MyBookAdminService service = new MyBookAdminService();

service.setDataSource(bookAdminDataSource());

return service;

}

}

Page 10: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/10

Configuration Classes with Java 8 Default Methods

@Configuration

public class MyApplicationConfig implements MyBookAdminConfig {

...

}

public interface MyBookAdminConfig {

@Bean

default BookAdminService myBookAdminService() {

MyBookAdminService service = new MyBookAdminService();

service.setDataSource(bookAdminDataSource());

return service;

}

}

Page 11: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/11

Generics-based Injection Matching

@Bean

public MyRepository<Account> myAccountRepository() { ... }

@Bean

public MyRepository<Product> myProductRepository() { ... }

@Service

public class MyBookAdminService implements BookAdminService {

@Autowired

public MyBookAdminService(MyRepository<Account> repo) {

// specific match, even with other MyRepository beans around

}

}

Page 12: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/12

Ordered Collection Injection

@Bean @Order(2)

public MyRepository<Account> myAccountRepositoryX() { ... }

@Bean @Order(1)

public MyRepository<Account> myAccountRepositoryY() { ... }

@Service

public class MyBookAdminService implements BookAdminService {

@Autowired

public MyBookAdminService(List<MyRepository<Account>> repos) {

// 'repos' List with two entries: repository Y first, then X

}

}

Page 13: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/13

Injection of Collection Beans

@Bean

public List<Account> myAccountList() { ... }

@Service

public class MyBookAdminService implements BookAdminService {

@Autowired

public MyBookAdminService(List<Account> repos) {

// if no raw Account beans found, looking for a // bean which is a List of Account itself

}

}

Page 14: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/14

Lazy Injection Points

@Bean @Lazy

public MyRepository<Account> myAccountRepository() {

return new MyAccountRepositoryImpl();

}

@Service

public class MyBookAdminService implements BookAdminService {

@Autowired

public MyBookAdminService(@Lazy MyRepository<Account> repo) {

// 'repo' will be a lazy-initializing proxy

}

}

Page 15: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/15

Component Declarations with JSR-250 & JSR-330

import javax.annotation.*;

import javax.inject.*;

@ManagedBean

public class MyBookAdminService implements BookAdminService {

@Inject

public MyBookAdminService(Provider<MyRepository<Account>> repo) {

// 'repo' will be a lazy handle, allowing for .get() access

}

@PreDestroy

public void shutdown() {

...

}

}

Page 16: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/16

Optional Injection Points on Java 8

import java.util.*;

import javax.annotation.*;

import javax.inject.*;

@ManagedBean

public class MyBookAdminService implements BookAdminService {

@Inject

public MyBookAdminService(Optional<MyRepository<Account>> repo) {

if (repo.isPresent()) { ... }

}

@PreDestroy

public void shutdown() {

...

}

}

Page 17: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/17

Declarative Formatting with Java 8 Date-Time

import java.time.*;

import javax.validation.constraints.*;

import org.springframework.format.annotation.*;

public class Customer {

// @DateTimeFormat(iso=ISO.DATE)

private LocalDate birthDate;

@DateTimeFormat(pattern="M/d/yy h:mm")

@NotNull @Past

private LocalDateTime lastContact;

...

}

Page 18: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/18

Declarative Formatting with JSR-354 Money & Currency

import javax.money.*;

import org.springframework.format.annotation.*;

public class Product {

private MonetaryAmount basePrice;

@NumberFormat(pattern="¤¤ #000.000#")

private MonetaryAmount netPrice;

private CurrencyUnit originalCurrency;

...

}

Page 19: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/19

Declarative Scheduling (with two Java 8 twists)

@Async

public Future<Integer> sendEmailNotifications() {

return new AsyncResult<Integer>(...);

}

@Async

public CompletableFuture<Integer> sendEmailNotifications() {

return CompletableFuture.completedFuture(...);

}

@Scheduled(cron="0 0 12 * * ?")

@Scheduled(cron="0 0 18 * * ?")

public void performTempFileCleanup() {

...

}

Page 20: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/20

Annotated MVC Controllers

@RestController

@CrossOrigin

public class MyRestController {

@RequestMapping(path="/books/{id}", method=GET)

public Book findBook(@PathVariable long id) {

return this.bookAdminService.findBook(id);

}

@RequestMapping("/books/new")

public void newBook(@Valid Book book) {

this.bookAdminService.storeBook(book);

}

}

Page 21: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/21

Precomposed Annotations for MVC Controllers

@RestController

@CrossOrigin

public class MyRestController {

@GetMapping("/books/{id}")

public Book findBook(@PathVariable long id) {

return this.bookAdminService.findBook(id);

}

@PostMapping("/books/new")

public void newBook(@Valid Book book) {

this.bookAdminService.storeBook(book);

}

}

Page 22: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/22

STOMP on WebSocket

@Controller

public class MyStompController {

@SubscribeMapping("/positions")

public List<PortfolioPosition> getPortfolios(Principal user) {

...

}

@MessageMapping("/trade")

public void executeTrade(Trade trade, Principal user) {

...

}

}

Page 23: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/23

Annotated JMS Endpoints

@JmsListener(destination="order")

public OrderStatus processOrder(Order order) {

...

}

@JmsListener(id="orderListener", containerFactory="myJmsFactory", destination="order", selector="type='sell'", concurrency="2-10")

@SendTo("orderStatus")

public OrderStatus processOrder(Order order, @Header String type) {

...

}

Page 24: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/24

Annotated Event Listeners

@EventListener

public void processEvent(MyApplicationEvent event) {

...

}

@EventListener

public void processEvent(String payload) {

...

}

@EventListener(condition="#payload.startsWith('OK')")

public void processEvent(String payload) {

...

}

Page 25: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/25

Declarative Cache Interaction

@CacheConfig("books")

public class BookRepository {

@Cacheable(sync=true)

public Book findById(String id) {

}

@CachePut(key="#book.id")

public void updateBook(Book book) {

}

@CacheEvict

public void delete(String id) {

}

}

Page 26: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/26

JCache (JSR-107) Support

import javax.cache.annotation.*;

@CacheDefaults(cacheName="books")

public class BookRepository {

@CacheResult

public Book findById(String id) {

}

@CachePut

public void updateBook(String id, @CacheValue Book book) {

}

@CacheRemove

public void delete(String id) {

}

}

Page 27: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/27

Spring Framework 4.3 Roadmap

■ Last 4.x feature release!

■ 4.3 RC1: March 2016

■ 4.3 GA: May 2016

■ Extended support life until 2020

● on JDK 6, 7, 8 and 9

● on Tomcat 6, 7, 8 and 9

● on WebSphere 7, 8.0, 8.5 and 9

■ Spring Framework 5.0 coming in 2017

● on JDK 8+, Tomcat 7+, WebSphere 8.5+

Page 28: Spring 4.3-component-design

Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under aCreative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/28

Learn More. Stay Connected.

■ Current: Spring Framework 4.2.5(February 2016)

■ Coming up: Spring Framework 4.3(May 2016)

■ Check out Spring Boot!http://projects.spring.io/spring-boot/

Twitter: twitter.com/springcentral

YouTube: spring.io/video

LinkedIn: spring.io/linkedin

Google Plus: spring.io/gplus