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

Breaking the Magician's Code - Diving deeper into Spring Boot internals

Phil Webb
February 28, 2017

Breaking the Magician's Code - Diving deeper into Spring Boot internals

Presented @DevNexus '17

Phil Webb

February 28, 2017
Tweet

More Decks by Phil Webb

Other Decks in Technology

Transcript

  1. Breaking the Magician's Code
    Diving deeper into Spring Boot internals

    View Slide

  2. @phillip_webb
    @madhurabhave23

    View Slide

  3. View Slide

  4. DEMO
    start.spring.io

    View Slide

  5. DEMO
    Starting from scratch

    View Slide

  6. Embedded Servlet Container
    Tomcat
    WAR ServletContainerInitializer
    AbstractAnnotationConfigDispatcherServletInitializer
    WebApplicationContext
    Dispatcher
    Servlet

    View Slide

  7. Embedded Servlet Container
    WebApplicationContext
    Embedded
    EmbeddedServletContainerFactory
    EmbeddedServletContainer getEmbeddedServletContainer(
    ServletContextInitializer... initializers);
    EmbeddedServletContainer
    start()
    stop()
    getPort()

    View Slide

  8. DEMO
    Back to the CODE

    View Slide

  9. Servlets
    WebApplicationContext
    Embedded
    Servlet
    Filter
    ServletContextInitializer
    ServletRegistrationBean
    FilterRegistrationBean

    View Slide

  10. Servlets
    WebApplicationContext
    Embedded
    Servlet
    DispatcherServlet
    @RequestMapping(“/foo”)
    @RequestMapping(“/bar”)

    View Slide

  11. DEMO
    Back to the CODE

    View Slide

  12. Component scanning
    • @Componentscan
    • base Packages
    • base Package Classes
    • (default)

    View Slide

  13. Component Scanning
    com.example.demo.core.*
    com.example.demo.domain.*
    com.example.demo.Application
    com.example.demo.config.*

    View Slide

  14. Component Scanning
    example
    demo
    com
    config
    core
    domain

    View Slide

  15. Component Scanning
    example
    demo
    com
    config
    core
    domain
    .Application

    View Slide

  16. Component Scanning
    example
    demo
    com
    config
    core
    domain
    .Application

    View Slide

  17. Component Scanning
    example
    demo
    com
    config
    core
    domain
    .Application

    View Slide

  18. Component Scanning
    example
    demo
    com
    config
    core
    domain
    .Application

    View Slide

  19. DEMO
    Back to the CODE

    View Slide

  20. Meta-Annotations
    • Most Spring Annotations can be used as
    meta-annotations
    • Use in your own code
    • Used extensively in the framework:
    •@RestController
    •@GetMapping

    View Slide

  21. META-Annotations
    • @AliasFor for advanced mappings:
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan
    public @interface SpringBootApplication {
    @AliasFor(annotation = EnableAutoConfiguration.class,
    attribute = "exclude")
    Class>[] exclude() default {};
    @AliasFor(annotation = ComponentScan.class,
    attribute = "basePackages")
    String[] scanBasePackages() default {};

    View Slide

  22. DEMO
    Back to the CODE

    View Slide

  23. Advanced ImportS
    • @Import(Regular.class)
    • ImportSelector
    • Return String[]
    • ImportBeanDefinitionRegistrar
    • Direct registration

    View Slide

  24. Spring Factories
    • Dirt simple way to discover
    implementations
    • Similar to Java Service Loader
    • Simple properties file
    • /META-INF/spring.factories

    View Slide

  25. DEMO
    Back to the CODE

    View Slide

  26. Conditions
    • @Conditional annotation
    • Condition interface
    public interface Condition {
    boolean matches(
    ConditionContext context,
    AnnotatedTypeMetadata metadata);
    }

    View Slide

  27. Conditions
    • Spring Framework @Profile
    • Spring Boot (Bean,Class,Property)
    • Ordered so fastest run first

    View Slide

  28. DEMO
    Back to the CODE

    View Slide

  29. Spring Boot Code
    •ConditionalOnAClass ->
    ConditionalOnClass
    • MagicApplication ->
    SpringBootApplication
    • EnableMagicAutoConfiguration ->
    EnableAutoConfiguration
    • EnableMagicProperties ->
    EnableConfigurationProperties
    • *Configuration -> *AutoConfiguration

    View Slide

  30. Summary
    • There’s no such thing as magic
    • Follow the breadcrumbs
    • Annotations
    • Import Selectors
    • Spring Factories
    • Conditions
    • Use the source!

    View Slide

  31. Thanks!
    Questions?
    @madhurabhave23 @phillip_webb
    speakerdeck.com/philwebb
    https://github.com/mbhave/non-magic-demo

    View Slide