Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Piotr Lewandowski

September 05, 2014
Tweet

More Decks by Piotr Lewandowski

Other Decks in Programming

Transcript

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

    View Slide

  2. Back-end
    Java 8
    Spring 4 + Spring boot
    Apache POI
    Thymeleaf
    Gradle
    Front-end
    bootstrap
    require.js
    npm
    bower
    gulp

    View Slide

  3. Java 8

    View Slide

  4. Java 7 way
    Java 8 way
    List humans = ...
    Collections.sort(humans, new Comparator() {
    @Override
    public int compare(Human h1, Human h2)
    return h1.getName().compareTo(h2.getName());
    }
    }
    List humans = ...
    Collections.sort(humans, (Human h1, Human h2) ­> {
    h1.getName().compareTo(h2.getName())
    });

    View Slide

  5. Streams API
    List persons = ...;
    Stream tenPersonsOver18 = persons.stream()
    .filter(p ­> p.getAge() > 18)
    .limit(10);
    boolean isEmptyRow = csvRowEntries.stream()
    .allMatch(str ­> str.isEmpty());
    if (isEmptyRow) {
    return null;
    }

    View Slide

  6. Streams API
    // set id, location
    employees.stream()
    .filter(e ­> e.getId().equals(id))
    .findFirst()
    .ifPresent(e ­> {
    e.setLocation(location);
    });
    public List getErrors() {
    return parseErrors.stream()
    .map(pe ­> pe.getMessage())
    .collect(Collectors.toList());
    }

    View Slide

  7. Streams in tests
    // arrange
    // ...
    List divergenceReport;
    List missingEmployees;
    // act
    divergenceReport = service.getDivergenceReport();
    missingEmployees = divergenceReport.stream()
    .map(MissingEmployee::getId)
    .collect(Collectors.toList());
    // assert
    assertThat(missingEmployees.contains("Robert Smith"), is(true));

    View Slide

  8. Confusions
    Closure
    Custom lambdas

    View Slide

  9. Closures
    int i = 0;
    persons.forEach(person ­> {
    if ( person == null) {
    i++; // Error: Variable must be final or effective final
    }
    ...
    });

    View Slide

  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));
    }
    }

    View Slide

  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));
    }

    View Slide

  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));
    }

    View Slide

  13. Spring 4
    with Spring boot
    Long story short

    View Slide

  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);
    }
    }

    View Slide

  15. start.spring.io

    View Slide

  16. Thymeleaf

    View Slide

  17. Primitive
    Maps
    Lists
    i18n config constans
    loops
    conditionals
    formats
    modules
    What can we put? What can we do?

    View Slide





  18. Name
    Cost
    Hours




    Project ID

    1000.0


    353




    View Slide

  19. HTML5 way

    /*/­­>

    ...
    ...


    ...

    /*/­­>

    View Slide

  20. Gradle

    View Slide

  21. Worries
    Do I need to learn groovy?
    Can I still use my dependencies?
    If my IDE supports gradle?

    View Slide

  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")
    }

    View Slide

  23. repositories {
    maven {
    credentials {
    username 'user'
    password 'password'
    }
    url "http://10.10.0.1/your­maven­repo"
    }
    }
    Custom repostiories

    View Slide

  24. So why gradle?
    Clean
    Efficient
    Easily expandable with plugins

    View Slide

  25. Front-end

    View Slide

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

    View Slide

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

    View Slide

  28. Front-end structure
    src
    ├── css
    ├── js
    dist
    ├── lib
    ├── css
    ├── js
    gulpfile.js
    bower.json
    package.json

    View Slide

  29. Build tools demo

    View Slide

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

    View Slide

  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

    View Slide

  32. Questions

    View Slide

  33. Thanks

    View Slide