Slide 1

Slide 1 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Getting Started with Spring in 2014 Brian Clozel (@brianclozel) - Stéphane Nicoll (@snicoll)

Slide 2

Slide 2 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ A brief history of Spring ! Started in 2002 ! AOP, IoC and DI ! Templates for JDBC/REST/JMS/… ! Abstractions (e.g. for Cache implementations) 2

Slide 3

Slide 3 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Aspect Oriented Programming 3 public BookLoan loan(User user, Book book) { if(user.isLibrarian()) { // do it } // else... forbidden } @Secured("ROLE_LIBRARIAN") // Spring Security uses AOP to back this public BookLoan loan(Book book) { // do it }

Slide 4

Slide 4 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Dependency Injection 4 // manual, tedious work DataSource ds = ... BookRepository bookRepo = new BookRepository(ds); UserService userService = new UserService(); SearchEngine search = new SearchEngine(bookRepo); LoanService loanService = new LoanService(userService, bookRepo);

Slide 5

Slide 5 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ DI with Spring 1/2 5 package org.example.app; @Configuration // used by the container to bootstrap your app @ComponentScan("org.example.app") // scans packages for Beans public class AppConfig { @Bean public DataSource datasource() { //... return ds; } }

Slide 6

Slide 6 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ DI with Spring 2/2 6 @Component // declare components with annotations public class LoanService { @Autowired public LoanService(UserService userService, BookRepository bookRepo) { //... } }

Slide 7

Slide 7 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Framework offers more! 7 ! Many other features ! Ongoing tradition of supporting standards ! Running in production, everywhere ! Spring 4 minimal requirements: • JDK6 and Servlet 2.5+ • Tomcat 6+, Jetty 7+, JBoss AS 6.1, Glassfish 3.1, Weblogic 10.3, Websphere 7 ! JDK8, Servlet 3.0/3.1 recommended!

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Application cache ! Required steps: • Configure a cache store • Check if a Book with that id exists in the cache every time the method is invoked • If so return it • If it does not, execute the method and cache the result before returning the value to the user 9 public Book findById(String id) { ... }

Slide 10

Slide 10 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Manual application cache 10 package spring; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Ehcache; import net.sf.ehcache.Element; import spring.Book; import spring.BookRepository; import org.springframework.util.Assert; public class BookRepositoryImpl implements BookRepository { private Ehcache booksCache; @Override public Book findById(String id) { // Check if item is not in the cache Element cacheHit = booksCache.get(id); if (cacheHit != null) { return (Book) cacheHit.getObjectValue(); } // Fetch the item if it's not in the cache Book result = doFindById(id); if (result != null) { Element element = new Element(id, result); booksCache.put(element); } return result; } protected Book doFindById(String id) { // Actual retrieval } public void setCacheManager(CacheManager cacheManager) { Assert.notNull(cacheManager, "CacheManager must not be null"); this.booksCache = cacheManager.getEhcache("books"); if (this.booksCache == null) { throw new IllegalStateException("No cache named 'books' was found"); } } }

Slide 11

Slide 11 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Manual application cache (cont’d) 11 private Ehcache booksCache; @Override public Book findById(String id) { // Check if item is not in the cache Element cacheHit = booksCache.get(id); if (cacheHit != null) { return (Book) cacheHit.getObjectValue(); } // Fetch the item if it's not in the cache Book result = doFindById(id); if (result != null) { Element element = new Element(id, result); booksCache.put(element); } return result; }

Slide 12

Slide 12 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Manual application cache (cont’d) 12 public void setCacheManager(CacheManager cacheManager) { Assert.notNull(cacheManager, "CacheManager must not be null"); this.booksCache = cacheManager.getEhcache("books"); if (this.booksCache == null) { throw new IllegalStateException("No cache named 'books' was found"); } }

Slide 13

Slide 13 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Configuring manual application cache 13 @Configuration public class ApplicationConfig { @Value("classpath:my-ehcache.xml") private Resource ehCacheConfig; @Bean public CacheManager ehCacheManager() { return EhCacheManagerUtils.buildCacheManager(ehCacheConfig); } @Bean public BookRepository bookRepository() { BookRepositoryImpl bookRepository = new BookRepositoryImpl(); bookRepository.setCacheManager(ehCacheManager()); return bookRepository; } }

Slide 14

Slide 14 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Application cache (the spring way) 14 package spring; import org.springframework.cache.annotation.Cacheable; public class BookRepositoryImpl implements BookRepository { @Override @Cacheable("books") public Book findById(String id) { ... } }

Slide 15

Slide 15 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Configuring application cache (the spring way) 15 @Configuration @EnableCaching public class ApplicationConfig { @Value("classpath:my-ehcache.xml") private Resource ehCacheConfig; @Bean public CacheManager ehCacheManager() { return new EhCacheCacheManager( EhCacheManagerUtils.buildCacheManager(ehCacheConfig)); } @Bean public BookRepository bookRepository() { return new BookRepositoryImpl(); } }

Slide 16

Slide 16 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Application cache (summary) ! No cache store specific access in your code • Separation of concern • Library specific APIs do not leak in your code ! Supported cache stores are updated for you • Ehcache, Hazelcast, JCache, Guava, Redis, JDK HashMap, etc. ! Benefit from new features (JCache support in 4.1) • Super easy once the infrastructure is in place 16

Slide 17

Slide 17 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Getting started guide - Try it out yourself! 17

Slide 18

Slide 18 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Consistent model ! Asynchronous processing - @EnableAsync ! Scheduling - @EnableScheduling ! Executor (TaskExecutor) abstraction 18 @Async public void indexBooks() { // very lengthy operation } @Scheduled(cron = "* * 0/4 * * MON-FRI") public void indexBooks() { ... }

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Auto-generated proxies ! Example: spring data repositories ! Auto-generated implementation • @EnableJpaRepositories • @EnableMongoRepositories 20 @Repository public interface BookRepository extends CrudRepository { Book findByISBN(ISBN isbn); Book findByAuthorAndTitle(String author, String title); }

Slide 21

Slide 21 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ The Web - Spring MVC 21

Slide 22

Slide 22 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ The Web - Spring MVC 22 ! Controller/Actions based ! Flexible ! Many points of extension ! Community-driven over the years

Slide 23

Slide 23 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Web Controllers / Views 23 @Controller @RequestMapping("/loan") public class BookLoanController { @RequestMapping("/show") public String showLoan(@RequestParam Long loanId, Model model) { BookLoan loan = this.repository.findLoan(loanId); model.add("loan", loan); return "loans/show"; } } http://server:8080/my-app/loan/show?loandId=42

Slide 24

Slide 24 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Web Controllers / REST 24 @RestController("/books") public class BooksController { @Autowired public BooksController(...) { } @RequestMapping("/{id}") public Book findBook(@PathVariable String id) { } } http://server:8080/my-app/books/42

Slide 25

Slide 25 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Web Controllers / Exception Handling 25 @ControllerAdvice(annotations = RestController.class) public class RestControllersAdvice { @ExceptionHandler(BookNotFoundException.class) public ResponseEntity handleNotFoundException( BookNotFoundException ex) { return ResponseEntity.notFound().build(); } }

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 27 “Spring Boot lets you pair-program with the Spring team. Josh Long, @starbuxman

Slide 28

Slide 28 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Boot ! Single point of focus ! Get you started very quickly with Spring ! Common non-functional requirements for a "real" application ! Exposes a lot of useful features by default ! Gets out of the way quickly if you want to change defaults ! An opportunity for Spring to be opinionated 28

Slide 29

Slide 29 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Boot - Simple example ! Declare a component when a condition matches ! Spring Boot auto-configuration infrastructure 29 @Configuration @ConditionalOnClass({ RabbitTemplate.class, Channel.class }) @ConditionalOnBean(ConnectionFactory.class) public class AmqpTemplateAutoConfiguration { @Bean @ConditionalOnMissingBean(RabbitTemplate.class) public RabbitTemplate rabbitTemplate(ConnectionFactory cf) { return new RabbitTemplate(cf); } }

Slide 30

Slide 30 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring portfolio & Spring platform 30 spring.io/platform

Slide 31

Slide 31 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Your next app? JDK8 + Spring Framework 4 + Spring Boot 31

Slide 32

Slide 32 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 32 Learn More. Stay Connected. ! Stay in touch on Twitter ! Watch talks on Youtube ! Ask questions on StackOverflow ! Features and bugs on JIRA Twitter: twitter.com/springcentral YouTube: spring.io/video Questions: spring.io/questions JIRA: jira.spring.io