Spring Boot: Sihir mi, Mühendislik mi?

Baran B.
5 min readOct 25, 2020

--

Java Dünyasında uygulama geliştirici olupta Spring Boot ile geliştirme yapmamış olmak pek düşünülemez, hatta biraz daha ileri gidip Java denilince aklına Spring Framework gelen bir çok yazılımcı tanıyorum :) Peki, bu kadar popüler olmasına rağmen, Spring Boot gerçekten çok iyi biliniyor mu diye sorsak? Subjektif bir bakış açısıyla diyebilirim ki, pek çok yazılımcı Spring Boot ile uygulama geliştirirken, Spring Boot’un nasıl çalıştığına dair pek fikir sahibi değil. Bu nedenlerden ötürü, Spring Framework’un ( özellikle de Spring Boot ) bilinmeyenleri hakkında bir yazı dizisi paylaşmak istedim. Umarım bu yazı dizisinin ilk yazısı size de bir şeyler katacaktır.

Bir web uygulaması geliştirdiğimizi düşünelim. Uygulamanın da 9001 portundan hizmet verdiğini varsayalım. Bunun için Spring Projemizin pom.xml dosyasına aşağıdaki dependency’i eklememiz ve yine aşağıda yazmış olduğum bir kod satırını application.properties eklemek gerekiyor.

pom.xml

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

application.properties

server.port=9001

Bu dependency’i ve port ayarını projemize eklediğimizde, uygulamamızı artık bir web uygulaması olarak çalıştırabiliyoruz. Peki, nasıl oluyorda sadece bir dependency ve bir satır kod ekleyerek standalone olan bir uygulamayı web uygulamasına çevirebiliyoruz? Spring’in Mühendisliği tam olarak da burada başlıyor.

spring-boot-autoconfigure

Bu proje, spring-boot projelerinde direk external library’nize eklenen default dependency’dir. Bu dependency ile Spring Framework’ün içerisinde bulunan bütün modüllerin ConfigurationProperties ve AutoConfiguration classlarını taşıyan projedir. Peki bu proje tam olarak ne işe yaramaktadır.

Projenin tam olarak ne işe yaradığını anlatmadan önce, şöyle projenin içerisinde ne tür sınıflar var bunları bir görelim. Siz de dilerseniz herhangi bir spring projesini açıp, bu dependency’i inceleyebilirsiniz.

spring-boot-autoconfigure.jar

Gördüğünüz gibi, içerisinde çok fazla paket ve sınıf bulunmakta. İlk bakışta gözünüzü korkutabilir ama korkmaya gerek yok çünkü her paketin bir amacı var. Bir paketin amacını öğrendiğinizde aslında diğer paketlerin de amaçlarını öğrenmiş olacaksınız. Gelin şimdi bu paketlerin tam olarak ne işe yaradığını öğrenelim.

Paketler

Buradaki her bir paket aslında Spring’in desteklediği modüllere denk gelmektedir. Spring bir çok modülü desteklemektedir. Örneğin Apache Kafka, Elastic Search, Jpa, Mongo, Flyway, Hazelcast gibi bir çok modülü bulunmaktadır. Siz bunları projenize dependency olarak eklediğinizde, bu framework veya kütüphanelerin kullanılması için gerekli minumum configurationlar bu paketlerin altında toplanmıştır.

Properties Sınıfları

Spring’e aşina iseniz daha önceden @ConfigurationProperties anotasyonuna denk gelmiş veya kullanmışsınızdır. Peki bu anotasyon tam olarak ne işe yarar? Kısaca söylemek gerekirse, application.properties’e ( veya dilediğiniz başka bir isimle /resources klasörü altına eklediğiniz properties dosyaları ) key=value şeklinde eklenen değerleri bir Java sınıfına setlemek için kullanılan bir anotasyon. Bu anotasyon sayesinde siz properties dosyaları içerisinde tutmuş olduğunuz değerleri Spring Component’i olarak kullanabileceğiniz anlamına geliyor.

AutoConfiguration Sınıfları

Autofofiguration sınıfları, classpath içerisinde yer alan kütüphanelere göre dinamik olarak ilgili kütüphaneye ait konfigürasyonları gerçekleştiren sınıflardır.

Şimdiye kadar mühendislik veya sihir adına hiç bir şey görememiş olabilirsiniz ama bundan sonra göreceğinize eminim :)

Şimdi, diyelim ki uygulamanızda Client olarak Apache Kafka kullanmak istiyorsunuz. Bunun için Apache Kafka Client için ilgili dependency’i pom.xml dosyasına ekledik. Bir client olduğunuzdan dolayı Apache Kafka’nın bootstrap adresine ihtiyacınız var. Bunun içinde application.properties dosyasına aşağıdaki satırı eklemeniz gerekiyor.

pom.xml

<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
</dependency>

application.properties

spring.kafka.bootstrap-servers = localhost:9093

Sadece bu iki işlemi yaparak artık projemizde Apache Kafka kullanabileceğiz. Çok kolay değil mi? Hatta sihir :)

Şimdi gelelim tam bu işin Spring tarafından tam olarak nasıl yapıldığına. spring-boot-auto-configure.jar projesinin altında kafka paketi bulunmaktadır.

Paketin içerisine baktığımızda KafkaProperties ve KafkaAutoConfiguration sınıflarını görüyoruz. Bu sınıfların tam olarak ne yaptığına bakalım.

KafkaProperties.class

KafkaProperties sınıfı oldukça büyük olduğu için tamamını paylaşmayacağım ama size neden Spring bu sınıflara ihtiyaç duymuş onu anlatacağım.

Bildiğiniz üzere Apache Kafka bir messaging kütüphanesi ve bu kütüphanenin 200'den fazla propertiesi vardır. Spring, bu propertieslerin tamamını bizim için bu sınıf üstünde tutmakta. Normalde biz eğer bir uygulama geliştirmiş olsaydık ( Spring Boot uygulaması olmadığını düşünün) ve uygulama da Apache Kafka kullanmak isteseydik; dynamic olmayan ama gerekli olan bu parametreleri Apache Kafka’yı kullanmak için set etmemiz gerekecekti. İşte Spring tam olarak bunu yapmakta. Spring kısaca diyor ki; messaging alt yapısına ihtiyacınız mı var? Ben de Apache Kafka’sından Rabbit MQ’süne kadar farklı farklı kütüphaneler var. Ben bunları sizin yerinize implement ettim, siz bunu kullanmak isterseniz eğer dependecy olarak ekleyin ben sizin yerinize bunları minumum requirement ile configure edeceğim. Ayrıca başka configurasyonlara mı ihtiyacın var? İlgili properties dosyasına bu konfigürasyonları ekle. Onu da halledeceğim. Ne güzel dünya değil mi :) İşte bu özellik sayesinde Spring Boot çok popüler.

@ConfigurationProperties(prefix=”spring.kafka”)

Bu sının en önemli satırı yukarıdaki satırdır.

Bu kod bloğu application.properties içerisindeki spring.kafka ile başlayan bütün propertiesleri bu sınıf içerisindeki ilgili alanlara set etmesini sağlıyor. Böylelikle siz properties dosyanıza spring.kafka ile başlayan herhangi bir value eklediğinizde spring bunu tanıyıp ilgili alana set ediyor. Hatta bu ayarlara göre konfigürasyon yapıyor.

Şimdi gelelin KafkaAutoConfiguration sınıfına.

Bu sınıf aslında classpathimizde KafkaTemplate sınıfının olup olmamasına göre runtime’da yaratılıyor. Eğer class-path içerisinde KafkaTemplate var ise bu da bizim dependency olarak projemize Kafka eklediğimizi gösteriyor. Eğer var ise bu sefer KafkaProperties dosyasını okuyor. İhtihyaç duyduğu iki tane daha configuration sınıfını import ediyor. Bu şekilde kafka’yı projemize dahil ediyor.

Şimdi sorumuzun cevabına gelelim, Sihir mi, Mühendislik mi?

Bana göre Spring Boot çok iyi mühendisler tarafından geliştirilen ve geliştirilmeye devam edilen mühendislik harikası bir framework. Eksikleri yok mudur? Vardır tabi. Selefi Quarkus gibi frameworkler çok daha hızlı çalışıyor. Belki bunu ayrıca başka bir yazının konusu ederim.

Spring’in sihri altındaki yazı dizime devam edeceğim, bir sonraki yazı dizim @Condition ve @Conditional anotasyonları ile ilgili olacak,

Kendinize iyi bakın, mutlu günler.

Sign up to discover human stories that deepen your understanding of the world.

--

--

Baran B.
Baran B.

Written by Baran B.

Software Architect | Java Engineer | Trip-Hop Listener | High-Level Reader

No responses yet

Write a response