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

Die Magie verstehen - Spring Boot Autokonfigura...

Die Magie verstehen - Spring Boot Autokonfigurationen und Starter selbst erstellen

Avatar for Francois Fernandes

Francois Fernandes

February 20, 2020

Other Decks in Programming

Transcript

  1. 1

  2. 4 @SpringBootApplication @RestController public class SimpleWebApplication { @GetMapping("/hello") public String

    getHello() { return "Hello World!"; } public static void main(String[] args) { SpringApplication.run(SimpleWebApplication.class, args); } }
  3. 5 @SpringBootApplication public class SimpleWebApplication { public static void main(String[]

    args) { SpringApplication.run(SimpleWebApplication.class, args); } }
  4. 6 @SpringBootApplication public class SimpleWebApplication { public static void main(String[]

    args) { SpringApplication.run(SimpleWebApplication.class, args); } }
  5. 7 @SpringBootApplication public class SimpleWebApplication { public static void main(String[]

    args) { SpringApplication.run(SimpleWebApplication.class, args); } } /* ... */ @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication { /* ... */ }
  6. 8 @SpringBootApplication public class SimpleWebApplication { public static void main(String[]

    args) { SpringApplication.run(SimpleWebApplication.class, args); } } /* ... */ @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication { /* ... */ }
  7. 12 @EnableAutoConfiguration Mach, dass es funktioniert! Hier ist der spring-boot-starter-amqp

    und nun: • Sorge für eine Dependency zur Client Library • Konfiguriere meine RabbitMQ Verbindung • Stelle mir das AmqpTemplate bereit #WeAreHiring
  8. 13 @EnableAutoConfiguration Mach, dass es funktioniert! #WeAreHiring Wer das ohnehin

    bereits weiß Hier ist der spring-boot-starter-amqp und nun: • Sorge für eine Dependency zur Client Library • Konfiguriere meine RabbitMQ Verbindung • Stelle mir das AmqpTemplate bereit Und wie soll das gehen?
  9. 14 @EnableAutoConfiguration 1. Suche nach möglichen Konfigurationen 2. Prüfe, ob

    sich die notwendigen Klassen einer Library auf dem Klassenpfad befinden 3. Konfiguriere die Library 4. Stelle Objekte als @Bean bereit 5. Respektiere explizit überschriebene @Bean-Objekte
  10. 15 @EnableAutoConfiguration 1. Suche nach Konfigurationen /* ... */ @AutoConfigurationPackage

    @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { /* ... */ }
  11. 16 @EnableAutoConfiguration 1. Suche nach Konfigurationen # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

    org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\ org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\ org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\ # ... META-INF/spring.factories Exkurs: SpringFactoriesLoader
  12. 17 @EnableAutoConfiguration 1. Suche nach Konfigurationen org.springframework.boot.autoconfigure admin - SpringApplicationAdminJmxAutoConfiguration

    aop - AopAutoConfiguration amqp - RabbitAutoConfiguration ... final List<String> candidates = SpringFactoriesLoader .loadFactoryNames(EnableAutoConfiguration.class, null); PrintUtil.printClassTree(candidates);
  13. 18 @EnableAutoConfiguration 1. Suche nach Konfigurationen org.springframework.boot.autoconfigure admin - SpringApplicationAdminJmxAutoConfiguration

    aop - AopAutoConfiguration amqp - RabbitAutoConfiguration ... final List<String> candidates = SpringFactoriesLoader .loadFactoryNames(EnableAutoConfiguration.class, null); PrintUtil.printClassTree(candidates);
  14. 20 @EnableAutoConfiguration 2. Prüfe, ob sich die notwendigen Klassen einer

    Library auf dem Klassenpfad befinden @Configuration(proxyBeanMethods = false) @ConditionalOnClass({ RabbitTemplate.class, Channel.class }) @EnableConfigurationProperties(RabbitProperties.class) @Import(RabbitAnnotationDrivenConfiguration.class) public class RabbitAutoConfiguration { /* ... */ }
  15. 21 @EnableAutoConfiguration 1. Suche nach möglichen Konfigurationen 2. Prüfe, ob

    sich die notwendigen Klassen einer Library auf dem Klassenpfad befinden 3. Konfiguriere die Library 4. Stelle Objekte als @Bean bereit 5. Respektiere explizit überschriebene @Bean-Objekte
  16. 22 @EnableAutoConfiguration 1. Suche nach möglichen Konfigurationen 2. Prüfe, ob

    sich die notwendigen Klassen einer Library auf dem Klassenpfad befinden 3. Konfiguriere die Library 4. Stelle Objekte als @Bean bereit 5. Respektiere explizit überschriebene @Bean-Objekte Nicht jetzt. Das kommt später
  17. 23 <Live Coding> (Klar, warum nicht. Was soll schon schief

    gehen?) #WeAreHiring Unerschrocken und Spaß an Technologien?
  18. 24 #WeAreHiring Ja, das steht da noch immer... example SshServerApplication

    sshd-mina Struktur von Autoconfigure- und Starter-Modulen
  19. 25 #WeAreHiring Ja, das steht da noch immer... example SshServerApplication

    mina-autoconfigure MinaSSHDAutoConfiguration META-INF/spring.factories mina-sshd-starter sshd-mina Struktur von Autoconfigure- und Starter-Modulen
  20. 26 #WeAreHiring Ja, das steht da noch immer... example SshServerApplication

    mina-autoconfigure MinaSSHDAutoConfiguration META-INF/spring.factories mina-sshd-starter sshd-mina provided Struktur von Autoconfigure- und Starter-Modulen
  21. 27 #WeAreHiring Ja, das steht da noch immer... example SshServerApplication

    mina-autoconfigure MinaSSHDAutoConfiguration MinaFTPAutoConfiguration META-INF/spring.factories mina-sshd-starter sshd-mina provided ftpserver (mina) provided mina-ftpserver-starter Struktur von Autoconfigure- und Starter-Modulen
  22. 28 #WeAreHiring Ja, das steht da noch immer... example FtpServerApplication

    mina-autoconfigure MinaSSHDAutoConfiguration MinaFTPAutoConfiguration META-INF/spring.factories mina-sshd-starter sshd-mina provided ftpserver (mina) provided mina-ftpserver-starter Struktur von Autoconfigure- und Starter-Modulen
  23. 34 @ConditionalOnClass(SshServer.class) @EnableConfigurationProperties(SSHDProperties.class) @Configuration public class MinaSSHDAutoConfiguration { @Autowired SSHDProperties

    properties; /* ... */ } Externalized Configuration @ConfigurationProperties(prefix = "mina.sshd") public class SSHDProperties { /** * The port on which the SSH server will be available. */ private int port = 8022; /** * A list of username and password pairs. */ private List<UserDetail> users; /* ... */ }
  24. 35 @ConditionalOnClass(SshServer.class) @EnableConfigurationProperties(SSHDProperties.class) @Configuration public class MinaSSHDAutoConfiguration { @Autowired SSHDProperties

    properties; /* ... */ } Externalized Configuration @ConfigurationProperties(prefix = "mina.sshd") public class SSHDProperties { /** * The port on which the SSH server will be available. */ private int port = 8022; /** * A list of username and password pairs. */ private List<UserDetail> users; /* ... */ } mina: sshd: port: 8022 users: - username: admin password: password - username: user password: user application.yml
  25. 38 Spring und Spring Boot bieten noch so viel mehr….

    War das alles? @ConditionalOnBean @ConditionalOnWebApplication @ConditionalOnSingleCandidate @ConditionalOnResource @ConditionalOnProperty @ConditionalOnNotWebApplication @ConditionalOnMissingClass @ConditionalOnJndi @ConditionalOnJava @ConditionalOnExpression @ConditionalOnCloudPlatform ImportSelector ImportBeanDefinitionRegistrar AnnotationMetadata
  26. 39 Welche Auto Configuration brauchen Sie? Photo by Anisur Rahman

    on Unsplash Feedback! #WeAreHiring https://blog.digitalfrontiers.de https://www.digitalfrontiers.de @tellme_francois github.com/fernanfs François Fernandès Senior Solution Architect Source Code github.com/dxfrontiers/spring-boot-magic-talk
  27. 40 Source Code für den Vortrag https://github.com/dxfrontiers/spring-boot-magic-talk Liste der Spring

    Boot AutoConfigurations https://docs.spring.io/spring-boot/docs/2.2.x/reference/html/appendix-auto-configuration-classes.html Referenz für die Erstellung eigener AutoConfiguration https://docs.spring.io/spring-boot/docs/2.2.x/reference/html/spring-boot-features.html#boot-features-developing-auto-configuration Referenzen