1) Spring framework nedir?
Spring, Java platformlarını kullanarak çeşitli uygulama türlerinin geliştirilmesine yardımcı olan bir framework’tür. Basit ve kullanımı kolaydır. Gerçek zamanlı teknik sorunların çözülmesine yardımcı olur. Spring, WEB MVC, IOC, DAO, AOP, Context ve ORM gibi birden fazla modül içerir.
2) Spring Boot nedir ve Spring Framework’ten farkı nedir?
Spring Boot, Java tabanlı bir framework olan Spring Framework üzerine inşa edilmiş, geliştiricilerin çok daha hızlı ve kolay bir şekilde bağımsız (standalone), üretime hazır (production-ready) uygulamalar geliştirmesini sağlayan bir çerçevedir.
Spring Framework: Bir iskelet. Geniş, esnek ama yapılandırması zahmetli.
Spring Boot: Bu iskeleti kullanarak hızlı ve kolay uygulama geliştirmeyi sağlar
3) Bean nedir? Spring konteyneri nedir ve nasıl çalışır?
“Spring Bean” ve “Spring konteyneri”, Spring Framework’ ün temel yapı taşlarındandır. Java ile geliştirme yapanlar için Spring, nesne yönetimini kolaylaştırır.
Spring Bean, Spring IoC (Inversion of Control) Container tarafından yönetilen nesnedir. Başka bir deyişle, Spring uygulaması içinde yaşam döngüsü Spring tarafından kontrol edilen bir Java sınıfıdır.
Spring’de, uygulamanızın omurgasını oluşturan ve Spring IoC konteyneri tarafından yönetilen nesnelere fasulye denir. Bir fasulye, bir Spring IoC konteyneri tarafından örneklenen, birleştirilen ve yönetilen bir nesnedir. Aksi takdirde, bir fasulye, uygulamanızdaki birçok nesneden sadece biridir. Fasulyeler ve aralarındaki bağımlılıklar, bir konteyner tarafından kullanılan yapılandırma meta verilerinde yansıtılır.
Java uygulamalarını geliştirmek için kullanılan Spring Framework, iş mantığı bileşenlerini ve nesnelerini yönetmek için “Spring Bean” adı verilen bir bileşen modeli kullanır. Spring Bean’ler, uygulamanızın farklı parçalarını temsil eden ve Spring Container tarafından yönetilen nesnelerdir.
Spring Bean, bir Java sınıfı veya bileşeni gibi düşünülebilir ve Spring Container tarafından yönetilir. Bu, Spring uygulamanızda kullanmak istediğiniz her türlü nesnenin bir Spring Bean olabileceği anlamına gelir. Spring Container, bu nesneleri oluşturur, yapılandırır, yönetir ve sonlandırır.
4) Spring’de Dependency Injection (bağımlılık enjeksiyonu) nedir?
Bağımlılık Enjeksiyonu (DI), uygulamayı yönetmeyi ve test etmeyi kolaylaştıracak şekilde programlama kodundaki bağımlılığı ortadan kaldıran bir tasarım modelidir. Dependency Injection Spring’in en önemli parçasıdır ve Inversion of Control’ ün bir uygulama metotudur. Dependency Injection, programlama kodunun gevşek bir şekilde bağlanmasını ve daha kolay test etmeyi sağlar.
IoC ile DI arasında nasıl bir ilişki var diye sorarsak:
Örneğin bir nesne oluşturmak istersin → new anahtar kelimesiyle yaparsın.
Ama IoC diyor ki:
“Sen new ile uğraşma, nesneleri ben (Spring) oluştururum.”
Yani kontrol sende değil, Spring’te. Bu yüzden adına “Inversion of Control” denir. Burada “Araba” sınıfı “Motor”a sıkı sıkıya bağlıdır. Motor değişirse, arabayı da değiştirmek zorundasın.
Dependency Injection, IoC’nin uygulanma şeklidir. Yani IoC bir “fikir”, DI ise bu fikrin “uygulama yöntemi”dir. Spring, nesneleri kendi oluşturur ve birbirine enjekte eder.
IoC = Nesneleri ben değil Spring oluşturacak,
DI = Spring oluşturduğu nesneleri birbirine bağlayacak.
İstemcinin bağımlılıklarını sağlama sorumluluğunun, başka bir nesneye devrettiği anlamına gelir. Yani belirli bir nesne için verilen bağımlılıkların veya yardımcı bileşenlerin enjekte edilmesidir. Örneğin nesnemiz bir araba olsun. Biz bir araba istediğimizde, araba fabrikası arabanın bağımlılıklarını ve bileşenlerini (Örneğin arabanın motoru, elektronik aksanını, egsozunu, kaportasını vb. parçalarını) bizim için birleşirir. Bu birleştirme işine Dependency Injection denir. Bu örnekte araba fabrikası Spring IoC konteyner’ dir.
5) IoC Nedir?
Bir framework ü extend ettiğimizde yani uygulamayı ayağa kaldırdığımızda, framework kontrolü kendisi ele alır. Yani hangi objeleri nasıl oluşturacağını, hangi objelerin arasında dependency ler olması gerektiğini ve nasıl yöneteceğini( Dependency Injection), hangi metotları çağıracağını, hangi excepcionları oluşturup hangi eventleri fırlatacağını, sonuç olarak bütün bunlara karar veren yapı framework ün kendisidir. Buna Inversion of Control denir.
Framework akış kontrolünü ele aldığı zaman IoC olur.
IoC; Nesneleri Manuel olarak kendimiz oluşturmak yerine bunu Spring IoC konteyner’ ın yapmasıdır. Spring Konteyner bir tür nesne fabrikası gibi çalışır.
@RestController ek açıklaması RESTful web servislerini oluşturmak için kullanılır. @RestController sınıfları, @Controller sınıflarına benzer bir şekilde çalışır. Ancak, @Controller’dan farklı olarak her metot çağrısı varsayılan olarak verileri JSON veya XML formatında döndürmek üzere optimize edilmiştir.
7) IoC(Inversion of Control) container ne işe yarar? Faydaları nelerdir?
Spring IoC Container, uygulamanızdaki nesnelerin oluşturulması, konfigürasyonu ve bağımlılıklarının yönetilmesi işlerini sizin yerinize yapar. Böylece gevşek bağlı (loosely coupled) ve daha kolay test edilebilir bir mimari elde edilir.
Inversion of Control (IoC), bir yazılım tasarım prensibidir. Temel fikri şudur:
“Nesneleri veya bağımlılıkları uygulama içinde kendin oluşturma, bu sorumluluğu bir framework veya dış bir mekanizmaya bırak.”
Eskiden programcılar, ihtiyaç duydukları nesneleri new anahtar kelimesiyle doğrudan oluştururdu. Bu, uygulamayı sıkı sıkıya bağımlı hale getirir ve bakımı zorlaştırır. IoC yaklaşımıyla ise programın akışını programcı değil, framework (örneğin Spring) yönetir. Yani “kontrolün tersine çevrilmesi” durumu gerçekleşir.
Spring Konteyner ın 2 temel işlevi vardır: IoC (Kontrolün Tersine Çevrilmesini) kullanarak nesneleri oluşturmak, kullanmak ve yönetmek daha sonra bağımlılık enjeksiyonunu kullanan nesne bağımlılıklarını enjekte etmektir.
8) Spring Boot’ta application.properties vs application.yml farkları nelerdir?
Spring Boot’ta hem application.properties hem de application.yml dosyaları, uygulamanın yapılandırma (konfigürasyon) ayarlarını tutmak için kullanılır. Her ikisi de aynı işlevi görür, ancak sözdizimleri ve okunabilirlikleri bakımından farklıdırlar.
application.properties
Küçük ve orta ölçekli projelerde daha yaygındır.

application.yml (YAML)

9) Spring MVC mimarisi nasıl çalışır?
Spring MVC (Model-View-Controller), Spring Framework’ün bir parçası olan web tabanlı bir mimaridir ve HTTP isteklerini karşılama, işleme ve sonuçları istemciye döndürme sürecini yöneten güçlü bir yapıdır.
Spring MVC’nin Temel Bileşenleri
Spring MVC Akış Diyagramı (Adım Adım)
Özetle
10) Maven nedir? Ne amaçla kullanılır? Faydaları nedir?
Spring Boot, Maven’ ın Standart Dizin(Klasör) Yapısını kullanır.
Maven; Bir Proje geliştirme aracıdır. Maven, Derleme yöntemidir ve bağımlılıklar için kullanılır. Maven şu problemleri çözmemizi sağlar:
Maven’ in Avantajları:
– Bağımlılık Yönetimi: Maven projemiz için gerekli JAR dosyalarını bizim için bulur.
– Projelerimizi inşa etmek ve çalıştırmak yani derleme ve sınıf yolu konusunda endişelenmemize gerek kalmaz.
– Standart Dizin yapısına sahiptir. Başka bir ekibin yarım kalmış projesinde zorluk çekmeyiz. Ve projeyi kendi ide mize taşıyabiliriz.
– ilk 3 madde sayesinde Maven daha Kurumsaldır diyebiliriz.
11) Spring @Controller nedir?
Bu sınıf, gelen isteklere cevap verecek bir Controller (denetleyici)” demektir.Spring uygulaması çalıştığında, @Controller ile işaretlenmiş sınıflar Spring IoC Container tarafından taranır (component scan) ve bean olarak kaydedilir.
@Controller, Spring Framework’te bir sınıfı denetleyici bileşen olarak işaretlemek için kullanılır. Web uygulamalarını yapılandırılmış bir şekilde oluşturmak için kullanılan Spring MVC (Model-View-Controller) mimarisinin bir parçasıdır.
@Controller, bir sınıfın Spring MVC’de bir denetleyici (controller) olarak işlev görmesini sağlar. Denetleyiciler, istemciden gelen talepleri alır, işler ve sonuç olarak bir görünüm (view) döndürür.
Bir sınıfa @Controller ile açıklama eklediğinizde, Spring onu bir denetleyici olarak tanır. HTTP isteklerini işlemesine ve HTTP yanıtları oluşturmasına izin verir. Denetleyiciler, kullanıcı isteklerini işlemekten, uygulamanın iş mantığıyla (hizmetler) etkileşim kurmaktan ve yanıtı oluşturmak için uygun görünümü döndürmekten sorumludur. Spring Controller ek açıklaması genellikle @RequestMapping ek açıklamasına dayalı açıklamalı işleyici yöntemleriyle birlikte kullanılır.
12) Spring Framework’te kaç modül var ve bunlar nelerdir?
Spring, farklı modüllerden oluşur ve her bir modül belirli bir geliştirme alanına odaklanır. Spring, yaklaşık 20 modül halinde düzenlenmiş özelliklerden oluşur.
Spring framework, core, beans, context, expression language, AOP, Aspects, Instrumentation, JDBC, ORM, OXM, JMS, Transaction, Web, Servlet, Struts vb. gibi birçok modülden oluşur.
Bu modüller, aşağıdaki şemada gösterildiği gibi Core Container, Data Access/Integration, Web, AOP (Aspect Oriented Programming), Instrumentation, ve Test olarak gruplandırılmıştır.
13) Spring yapılandırma dosyası nedir?
Spring yapılandırma dosyası, .xml uzantılı, sınıflar ve arayüzler ile ilgili bilgileri içeren XML dosyasıdır. Bu dosya, sınıfların nasıl yapılandırıldığını ve birbirlerine nasıl tanıtıldığını açıklar.
Spring yapılandırma dosyası, Spring Framework’ün Inversion of Control (IoC) prensibi ve bağımlılık enjeksiyonu mekanizmasını kullanarak uygulamanın bileşenlerini yönetmesine yardımcı olur.
14) Spring’in farklı bileşenleri nelerdir?
Spring uygulamaları genellikle farklı amaçlara hizmet eden, farklı tipte bileşenler içerir. Bir Spring uygulaması genel olarak aşağıdaki bileşenlerden oluşur:
User Program: Fonksiyonları kullanır.
Interface: Fonksiyonları tanımlar.
Bean class: Spring’in temel bileşeni olan Bean class, özellikleri ve işlevleri içerir.
Spring Aspect Oriented Programming (AOP): Kesişen konuların işlevselliğini sağlar.
Bean Configuration File: Sınıfların bilgilerini ve bunların nasıl yapılandırılacağını içerir.
İki tür IoC konteyneri vardır:
1️.BeanFactory: Spring’de tanımlanan ve yönetilen nesneleri (bean’leri) oluşturma, konfigüre etme ve yönetme işlevlerini sağlar. BeanFactory, özellikle büyük ve karmaşık uygulamalarda, bean’leri gecikmeli (lazy) veya önceden yaratılmış (pre-instantiated) olarak oluşturmanıza, bu bean’lerin yaşam döngüsünü yönetmenize ve bağımlılık enjeksiyonunu gerçekleştirmenize olanak tanır.
XmlBeanFactory, BeanFactory arayüzünün uygulama sınıfıdır. BeanFactory’yi kullanabilmek için XmlBeanFactory sınıfı kullanılır.
2️.ApplicationContext: ApplicationContext arayüzü, BeanFactory arayüzünün üzerine inşa edilmiştir. BeanFactory’nin üstünde bazı ekstra işlevler oluşturmayı sağlar.
ClassPathXmlApplicationContext sınıfı, ApplicationContext arayüzünün uygulama sınıfıdır. ApplicationContext’i kullanabilmek için ClassPathXmlApplicationContext sınıfını aşağıda verildiği gibi başlatmanız gerekir.
BENZETME: “Araba Servisi”
1. IoC Container (Genel kavram)
“Ben nesneleri senin yerine oluştururum, bağımlılıklarını bağlarım, sen sadece kullan.”
Yani:
2. BeanFactory (Temel versiyon)
En basit hali.
“İhtiyacın olunca ben parçayı (bean) üretirim.”
BeanFactory factory = new XmlBeanFactory(new FileSystemResource(“beans.xml”));
Araba araba = (Araba) factory.getBean(“araba”);
3. ApplicationContext (Gelişmiş versiyon)
“Ben sadece parçayı üretmem, servisle ilgili ekstra işler de yaparım.”
ApplicationContext context = new ClassPathXmlApplicationContext(“beans.xml”);
Araba araba = (Araba) context.getBean(“araba”);
4. Spring Context (Gündelik terim)
İnsanlar ApplicationContext yerine bazen buna “Spring Context” der.
“Spring context üzerinden al” → ApplicationContext’ten al demek.
16) @Component, @Service, @Repository anotasyonlarının farkı nedir?
@Component
@Service
@Repository
Yani JDBC gibi düşük seviye hataları, Spring’in veri erişim istisna hiyerarşisine dönüştürür.
Yine @Component’ten türemiştir.
Veri erişim katmanındaki (DAO) sınıflar için kullanılır.
Ek olarak, Spring bu anotasyonu taşıyan sınıflar için:

17) @Controller ve @RestController arasındaki fark nedir?
@Controller → View döndürür (HTML sayfası, JSP, Thymeleaf vb.)@RestController → JSON/XML gibi direkt veri döndürür (REST API için)Aslında @RestController, @Controller + @ResponseBody birleşimidir.

/merhaba çağrıldığında:
merhaba.html dosyası açılır.${mesaj} yazarsan, ekrana "Spring MVC'den Selamlar!" gelir.Yani bu kullanım sayfa (View) döndürür.

/merhaba çağrıldığında:
"Spring REST API'den Selamlar!" cevabı gelir.Yani bu kullanım veri (JSON/String) döndürür.

18) @Autowired Nedir?
@Autowired gördüğü yerde ilgili bean’i bulur ve oraya otomatik olarak enjekte eder.Bu sınıf, çalışmak için başka bir sınıfa ihtiyaç duyuyor. Spring, o bağımlılığı otomatik olarak bana ver” demektir.UserService, UserRepository sınıfına sıkı sıkıya bağımlı hale gelir. Eğer UserRepository yerine OracleUserRepository kullanmak istersek, kodu değiştirmek zorunda kalırız. Bu da esnekliği azaltır ve test etmeyi zorlaştırır.new ile → sıkı bağlılık (tight coupling) oluşur. @Autowired ile → gevşek bağlılık (loose coupling) sağlanır. Yani @Autowired, sınıfların birbirine olan bağımlılığını azaltarak SOLID prensiplerine uygun yazılım geliştirmemizi sağlar.@Autowired Ne İşe Yarar?
Daha temiz, test edilebilir ve bakımı kolay kod yazmayı sağlar.
Kod içinde new anahtar kelimesiyle nesne üretmeye gerek kalmaz.
Spring Container, uygun bean’i bulup ilişkilendirir.
@Autowired, Spring’in IoC Container’ına “Bu bağımlılığı otomatik olarak bul ve buraya ekle” talimatı verir.19) @Primary ve @Qualifier anotosyonları nedir? Ne işe yarar?
Diyelim ki garajında iki araba var:
Sen yardımcına diyorsun ki:
“Garajdan arabayı getir!”
Ama yardımcı şaşırıyor:
“Hangisini getireyim patron? BMW mi, Mercedes mi?”
İşte Spring de böyle kararsız kalıyor.
@Qualifier → “Hangisini istediğini açıkça söyle.”@Primary → “Varsayılan olarak hep bunu seç.”Diyelim ki iki farklı sınıf var:
@Component(“bmw”)
public class BMW implements Araba {
public void sur() { System.out.println(“BMW sürülüyor!”); }
}
@Component(“mercedes”)
public class Mercedes implements Araba {
public void sur() { System.out.println(“Mercedes sürülüyor!”); }
}
Ve başka bir sınıfta araba kullanmak istiyorsun:
@Component
public class Sofor {
@Autowired
@Qualifier(“bmw”) // Hangisini istiyorsak belirtiyoruz
Araba araba;
public void yolaCik() {
araba.sur();
}
}
Spring şunu anlıyor:
“Tamam, bmw etiketli arabayı veriyorum.”
Sonuç:
BMW sürülüyor!
@Qualifier = “Aynı tipte birden fazla nesne varsa, adını yazarak seç.”
Yine aynı örnekte, diyelim ki sen hep Mercedes’i tercih ediyorsun.
Her seferinde @Qualifier("mercedes") yazmak istemiyorsun.
O zaman Mercedes sınıfına @Primary eklersin:
@Component
@Primary
public class Mercedes implements Araba {
public void sur() { System.out.println(“Mercedes sürülüyor!”); }
}
Artık başka yerde şöyle yazsan bile:
@Autowired
Araba araba;
Spring otomatik olarak der ki:
“Tamam, varsayılan @Primary olan Mercedes’i kullanıyorum.”
Sonuç:
Mercedes sürülüyor!
@Primary = “Birden fazla varsa, varsayılan olarak beni seç.”
Evet!
Genelde şöyle olur:
@Primary → en çok kullanılan nesneye koyarsın.@Qualifier → özel durumlarda farklı bir nesne istersin.Örnek:
@Autowired
@Qualifier(“bmw”)
Araba digerAraba;
Burada, varsayılan Mercedes olsa bile özel olarak BMW isteniyor.