On Github JanAhrens / spring-boot-intro
Java or JVM-based language (Groovy, Clojure, Scala, Kotlin)
Gradle or Maven
Spring or Spring Boot
Also known as inversion of control (IoC)
Hollywood principle: "Don't call us, we call you"
class Demo {
    private final Foobar foobar;
    public Demo() {
        foobar = new Foobar(); // dependency NOT injected
    }
    public void doStuff() {
        foobar.doStuff();
    }
}
    
            
        class Demo {
    private final Foobar foobar;
    public Demo(Foobar foobar) {  // dependency injection
        this.foobar = foobar;
    }
    public void doStuff() {
        foobar.doStuff();
    }
}
    
            
        Modularization
Testable code
Decrease coupling
Behavior can be changed
Separate cross-cutting concerns
In plain English: reduce duplications
Aspect = concern
Logging
Transaction management
Authentication
class BookController {
    private final UserService userService;
    // ...
    public Response index(Request request) {
        if (userService.isAuthenticated(request) {
            // ...
        } else {
            return Response.unauthorized();
        }
    }
    public Response get(Request request) {
        if (userService.isAuthenticated(request) {
            // ...
        } else {
            return Response.unauthorized();
        }
    }
}
    
            
        class BookController {
    @Authenticated
    public Response index(Request request) {
        // ...
    }
    @Authenticated
    public Response get(Request request) {
        // ...
    }
}
    
            
        IoC container
Spring AOP framework
XML based configuration
Lots of things to configure
Convention over configuration
Easily extensible through "Starter POMs"
Micro-framework paradigm
https://twitter.com/rob_winch/status/364871658483351552
$ sdk install springboot
$ spring run hello-spring.grooy
But a lot of people use it for
Not the same!
JavaBean: A plain Java class
JavaBean: Getter and setter, public constructor, serializable
class JavaBean {
  private final String name;
  public void setName(String name) {
      this.name = name;
  }
  public void getName() {
    return name;
  }
}
  
          
        Object instance managed by the Spring IoC container
@Bean, @Autowired and @PostConstruct
ratpack-spring-boot (unofficial starter)
spring-boot-starter-jdbc
spring-boot-starter-web
spring-boot-starter-data-jpa
HTML templates (and LiveReload)
Externalized configuration
Spring security
.. and a lot more