SPRING BOOT IN PRACTICE

Furkan Şahin Kulaksız
3 min readMar 13, 2023

--

Chapter -1-

Spring Boot Components

Spring Boot projelerinin hemen hemen hepsinde kullanılan bazı core spring boot componentleri vardır. Bunlar;

  • spring-boot
    Embedded web serverlarına destek sağlar.
    SpringApplication class’ını içerir.
    Applicationun database detayları gibi externalized configurasyonlara destek sağlar.
  • spring-boot-autoconfigure
    Bir spring boot application için gerekli otomatik configigurationları sağlar. Verilen classpath’teki bağımlılıkları ya da configurationları okur. Eğer developer tarafından bu autoconfigler override edilirse(ki edilebilir) o zaman default değerlerinden uzaklaşıp developerın yaptığı ayarlara döner.
  • spring-boot-starters
    Starters developerlara kolaylık olması için önceden paketlenmiş dependency tanımlayıcısıdır.
  • spring-boot-CLI
    Geliştirici dostu, groovy codelarını compile ve run eder. Aynı zamanda dosyadaki değişiklikleri de izler. Ve bu yüzden modificationlardan sonra projeyi bir daha restart etmeye gerek kalmaz. CLI aracı maven ya da gradle gibi bağımlılık toollarına olan ihtiyaçtan muaf kılar.
  • spring-boot-actuator
    Endpointlerin bir Spring Boot uygulamasıyla etkileşim kurmasını, izlemesini ve denetlemesini sağlar. Spring Boot içerisindeki bir actuator JMX veya HTTP endpointleri tarafından manage edilebilir.
  • spring-boot-actuator-autoconfigure
    Bu component classpathe dayalı olarak actuator enpointlerini otomatik olarak yapılandırmak için destek sağlar.
  • spring-boot-test
    Spring boot applicationlara test yazmak için gerekli methodları ve annotationları barındırır.
  • spring-boot-test-autoconfigure
    Applicationun test caselerinin otomatik configurationlarını destekler.
  • spring-boot-loader
    Bu component bir Spring Boot uygulamasının tüm bağımlılıklarını ve bağımsız olarak çalışabilen gömülü web sunucularını, her şeyi, tek bir JAR dosyası olarak paketlemesine izin verir.
  • spring-boot-devtools
    Çok kısaca, değişikliği algılayıp reload yapar.

Servlet tabanlı web uygulaması, yalnızca Apache Tomcat veya Jetty gibi bir Servlet Konteynerinde çalışabilir. Spring Boot, varsayılan olarak uygulamada katıştırılmış bir Apache Tomcat sunucusu kullanarak bu desteği etkinleştirir. Böylece, Spring Boot uygulamanızı main() yöntemini kullanarak başlattığınızda, Spring Boot, Apache Tomcat sunucusunun gömülü bir örneğini başlatır ve web uygulamasını bunun içinde çalıştırır.

Bir spring boot applicationu başlatığımız zaman main class’ında @SpringBootApplication annotationu ile karşılaşırız. Bu annotation aslında 3 farklı annotationun kombinasyonudur. Bunlar;

  • @EnableAutoConfiguration annotation
    Spring Boot bazı spesific featurlerı etkinleştirmek için @Enable* annotationlarını kullanır. Bu annotation Application Classpath’teki JAR bağımlıklılarına bağlı olarak uygulamayı otomatik olarak yapılandırmak için Spring Boot gerekli desteği sağlar.
  • @ComponentScan annotation
    Uygulamadaki spring componentler için paketlerin taranması desteğini sağlar.
  • @SpringBootConfiguration annotation
    Configuration annotationu ile imlenmiş classların bulunmasına ve içeri alınmasına yardımcı olur.

Bir spring boot uygulamasını çalıştırdığınızda aşağıdaki maddeler olur.

  • Bir Application Context instance’ı oluşturulur.
  • Komut satırı bağımsız değişkenlerini Spring özellikleri olarak göstermek için bir CommandLinePropertySource kaydeder
  • Tüm singleton beanleri yüklemek için oluşturulan Application Context’ti yeniler.
  • ApplicationRunners’ı ve CommandRunners’ı triggerlar.

Dependency Injection yaklaşımı ya da IoC (Inversion of Control) yaklaşımı Spring’in nesneleri oluşturmasına ve bağımlılıkların harici olarak enjekte edilmesşne olanak tanır. Bean tanımları Spring’e XML bean tanım dosyaları ya da annotation-based configurationlar ile birlikte sunulur. Spring, bu bean tanımlarını yükler ve bunları Spring IoC kapsayıcısında tutar. ApplicationContext interfacei Spring IoC görevi görür. Spring, uygulama türüne (Servlet veya Reaktif uygulama), bean tanım yapılandırmalarına (örneğin, sınıf yolundan veya ek açıklamalardan yüklemek için) vb. dayalı olarak çok sayıda ApplicationContext uygulaması sağlar.

SpringApplication sınıfı, classpathte bulunan JAR bağımlılıklarına dayalı olarak bir ApplicationContext örneği oluşturmaya çalışır. Bir Spring Boot web uygulaması, Servlet tabanlı veya reaktif tipte olabilir. Spring’in sınıf yükleme tekniklerinden yararlanan ve classpathteki sınıfların mevcudiyetine bağlı olarak Spring, mevcut uygulamanın türünü çıkarır. Uygulama türü bilindikten sonra Spring Boot, uygulama içeriğini yüklemek için aşağıdaki stratejiyi uygular:

  • Eğer Servlet-Based web application tanımlı ise, Spring Boot AnnotationConfigServletWebServerApplicationContext class’ını oluşturmaya çalışır.
  • Eğer Application bir reactive type ise, Spring Boot AnnotationConfigReactiveWebServerApplicationContext classını oluşturmaya çalışır.
  • Eğer bunlardan ikisi de değilse, Spring Boot AnnotationConfigApplicationContext classını oluşturmaya çalışır.

JAR File Project Structure

Buradaki project structure’u 4 farklı section altında inceleyebiliriz.

  • META-INF : Bu section’da JAR hakkında çalıştırılması gereken bir çok kritik bilgiyi içeren MANIFEST.MF dosyasını içerir. Bu dosyada sunulan iki anahtar parametre, Main-Class ve Start-Class detaylarıdır.
  • Spring Boot Loader Class : Spring Boot loader, executable file’ı yüklemek için kullanılan çeşitli yükleyici uygulamaları sağlar.
  • BOOT-INF/classes : Bütün uygulama class file’ları bu folder altında paketlenmiştir.
  • BOOT-INF/lib : Bu dosya , application için bütün dependency’leri içerir.

Dikkat edilmesi gereken önemli noktalardan biri, MANIFEST.MF dosyasında Main Class ve Start Class parametrelerinin kullanılmasıdır. Main Class, uygulamayı başlatmak için Starter Class’ta belirtilen sınıfı kullanan starter sınıf adını içerir. Spring Boot çalıştırılabilir bir JAR’da, Start-Class her zaman Spring Boot ana sınıfınızdır.

İletişim, İşbirlikleri ve Teklifler için,

github: https://github.com/fsk

bitbucket: https://bitbucket.org/furkandev

twitter: https://twitter.com/0xfsk

mail: furkansahinkulaksiz@gmail.com

linkedIn: https://www.linkedin.com/in/frknshnklksz/

--

--