Case study: Java 8 + Spring boot

Case study: Java 8 + Spring boot

I've made an internal application using newest technologies and aproaches.

Here is case study of what I achived and what I found interesting about new technology stack.

Slides contains examples of:
- Java 8 feautures
- Spring boot
- Thymeleaf
- Gradle
- front-end builds

B48000922680b510078188df438184dd?s=128

Piotr Lewandowski

September 05, 2014
Tweet

Transcript

  1. Case study Classic MVC with separated front-end Piotr Lewandowski @piotlr

  2. Back-end Java 8 Spring 4 + Spring boot Apache POI

    Thymeleaf Gradle Front-end bootstrap require.js npm bower gulp
  3. Java 8

  4. Java 7 way Java 8 way List<Human> humans = ...

    Collections.sort(humans, new Comparator<Human>() { @Override public int compare(Human h1, Human h2) return h1.getName().compareTo(h2.getName()); } } List<Human> humans = ... Collections.sort(humans, (Human h1, Human h2) ­> { h1.getName().compareTo(h2.getName()) });
  5. Streams API List<Person> persons = ...; Stream tenPersonsOver18 = persons.stream()

    .filter(p ­> p.getAge() > 18) .limit(10); boolean isEmptyRow = csvRowEntries.stream() .allMatch(str ­> str.isEmpty()); if (isEmptyRow) { return null; }
  6. Streams API // set id, location employees.stream() .filter(e ­> e.getId().equals(id))

    .findFirst() .ifPresent(e ­> { e.setLocation(location); }); public List<String> getErrors() { return parseErrors.stream() .map(pe ­> pe.getMessage()) .collect(Collectors.toList()); }
  7. Streams in tests // arrange // ... List<MissingEmployee> divergenceReport; List<String>

    missingEmployees; // act divergenceReport = service.getDivergenceReport(); missingEmployees = divergenceReport.stream() .map(MissingEmployee::getId) .collect(Collectors.toList()); // assert assertThat(missingEmployees.contains("Robert Smith"), is(true));
  8. Confusions Closure Custom lambdas

  9. Closures int i = 0; persons.forEach(person ­> { if (

    person == null) { i++; // Error: Variable must be final or effective final } ... });
  10. Custom lamdas public class Main { public static void runCalc(

    ??? calc) { // ??? } public static void main(String[] args) { BigDecimal a = new BigDecimal(); runCalc(a ­> a.multiply(a)); } }
  11. Custom lambdas Scala def runCalc(calc: (BigInt => BigInt)) { //

    ??? } Java interface MyCalcLambda { BigInteger run(BigInteger input); } public static void runCalc(MyCalcLambda calc) { // ??? } public static void main(String[] args) { runCalc(a ­> a.multiply(a)); }
  12. Runing custom lambdas Scala def runCalc(calc: (BigInt => BigInt)) {

    System.out.println(calc(10)) } Java public static void runCalc(MyCalcLambda calc) { System.out.println(calc(BigInteger.TEN)); }
  13. Spring 4 with Spring boot Long story short

  14. Configuration public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder

    configure(SpringApplicationBuilder application) { return application.sources(Application.class); } } @Configuration @ComponentScan @EnableAutoConfiguration public class Application extends WebMvcConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
  15. start.spring.io

  16. Thymeleaf

  17. Primitive Maps Lists i18n config constans loops conditionals formats modules

    What can we put? What can we do?
  18. <div th:replace="fragments/header :: header"> </div> <table> <thead> <tr> <th th:text="#{project.name}">Name</th>

    <th th:text="#{project.cost}">Cost</th> <th th:text="#{project.hours}">Hours</th> </tr> </thead> <tbody> <tr th:each="project : ${projects}"> <td th:text="${project.projectId}">Project ID</td> <td th:text="${#numbers.formatDecimal(project.salary, 1, 'COMMA', 2, 'POINT')}"> 1000.0 </td> <td th:text="${#numbers.formatDecimal(project.hours, 1, 'COMMA', 2, 'POINT')}"> 353 </td> </tr> </tbody> </table>
  19. HTML5 way <table> <!­­/*/ <th­block data­th­each="user : ${users}"> /*/­­> <tr>

    <td data­th­text="${user.login}">...</td> <td data­th­text="${user.name}">...</td> </tr> <tr> <td data­th­text="${user.address}">...</td> </tr> <!­­/*/ </th­block> /*/­­> </table>
  20. Gradle

  21. Worries Do I need to learn groovy? Can I still

    use my dependencies? If my IDE supports gradle?
  22. gradle hello world apply plugin: 'java' sourceCompatibility = 1.8 jar

    { baseName = 'demo' version = '0.0.1­SNAPSHOT' } repositories { mavenCentral() } dependencies { compile("org.springframework.boot:spring­boot­starter­web") compile("org.springframework.boot:spring­boot­starter­thymeleaf") testCompile("org.springframework.boot:spring­boot­starter­test") }
  23. repositories { maven { credentials { username 'user' password 'password'

    } url "http://10.10.0.1/your­maven­repo" } } Custom repostiories
  24. So why gradle? Clean Efficient Easily expandable with plugins

  25. Front-end

  26. Building front-end Modularity Dependency managment Production-ready Tests

  27. Cons Many, many tools Frequent changes Pros Many, many tools

    Frequent changes
  28. Front-end structure src ├── css ├── js dist ├── lib

    ├── css ├── js gulpfile.js bower.json package.json
  29. Build tools demo

  30. Building process What are doing when we type `gradle build`

  31. gradle build 1. Compille front-end 1. Download tools with NPM

    2. Download dependencies with bower 3. Build front-end with gulp 4. Pack into JAR 2. Compile the rest with front-end as a dependency
  32. Questions

  33. Thanks