Spring @Autowired Nedir? Constructor, Setter ve Field Injection (2025)
Spring @Autowired anotasyonu, Spring Framework'te otomatik bağımlılık enjeksiyonu (Dependency Injection – DI) yapmak için kullanılan temel anotasyonlardan biridir.
Spring Boot ile uygulama geliştiren herkesin mutlaka anlaması gereken bu yapı, sınıflar arasındaki bağımlılıkları manuel olarak yönetmek yerine Spring Container'a bırakmanızı sağlar.
Bu rehberde:
- @Autowired anotasyonu nedir?
- Ne zaman ve nasıl kullanılır?
- Constructor, Setter ve Field Injection farkları
- Yaygın hatalar ve çözümleri
- En iyi kullanım önerileri (2025)
Spring @Autowired Anotasyonu Nedir?
@Autowired, Spring tarafından yönetilen bir bean'in, başka bir bean'e otomatik olarak enjekte edilmesini sağlar.
Spring Framework, Dependency Injection (Bağımlılık Enjeksiyonu) prensibi üzerine kuruludur. Bu sayede sınıflar, ihtiyaç duydukları bağımlılıkları kendileri oluşturmaz; Spring Container bu bağımlılıkları onlar adına bulup sağlar.
@Autowired = "Bu bağımlılığı Spring Container benim yerime enjekte etsin"
@Autowired anotasyonu üç farklı yerde kullanılabilir:
- Alan (Field) enjeksiyonu — en sık kullanılan, en az önerilen
- Setter metodu enjeksiyonu — opsiyonel bağımlılıklar için
- Yapıcı (Constructor) enjeksiyonu — Spring tarafından önerilen yöntem
@Autowired Anotasyonu Nasıl Etkinleştirilir?
Spring Boot uygulamalarında ekstra bir ayar yapmanıza gerek yoktur. @SpringBootApplication anotasyonu sayesinde, Spring otomatik olarak component scanning (bileşen taraması) yapar.
@SpringBootApplication
public class EgitimApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(EgitimApplication.class, args);
}
}
Bu yapı sayesinde:
- Aynı paket ve alt paketlerdeki
@Service,@Repository,@Componentanotasyonlu sınıflar bean olarak kaydedilir - @Autowired ile bu bean'ler kolayca enjekte edilebilir
@Autowired Kullanım Çeşitleri
1. Constructor (Yapıcı) Enjeksiyonu — Spring Tarafından Önerilen Yöntem
Constructor injection, Spring tarafından en çok önerilen bağımlılık enjeksiyonu yöntemidir. Bağımlılıkları zorunlu kılar ve immutable (değiştirilemez) yapı sağlar.
@Service
@Transactional
public class AccountService {
private final UserRepository userRepository;
@Autowired
public AccountService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
💡 Spring Boot İpucu: Tek constructor varsa @Autowired yazmaya bile gerek yoktur.
Spring, constructor'ı otomatik olarak tespit eder.
Avantajları:
- Bağımlılıklar zorunlu hale gelir — null pointer riski azalır
- Immutable (değiştirilemez) yapı sağlar —
finalkullanılabilir - Test edilebilirlik artar — mock enjeksiyonu kolaylaşır
2. Setter Metodu Enjeksiyonu
Setter injection, bağımlılığın sonradan değiştirilebildiği veya opsiyonel olduğu durumlarda kullanılabilir.
@Service
@Transactional
public class AccountService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
Zorunlu bağımlılıklar için önerilmez — nesne, bağımlılık enjekte edilmeden de oluşturulabilir.
3. Alan (Field) Enjeksiyonu — Mümkünse Kaçınılmalı
En sık kullanılan ama en az önerilen yöntemdir. Özellikle büyük projelerde bakım ve test süreçlerini zorlaştırır.
@Service
@Transactional
public class AccountService {
@Autowired
private UserRepository userRepository;
}
Dezavantajları:
- Unit test yazmayı zorlaştırır — Spring context olmadan çalışmaz
- Bağımlılıklar gizlenir — kod okunabilirliği düşer
- Immutable yapı kurulamaz —
finalkullanılamaz
@Autowired Kullanırken Sık Yapılan Hatalar
1. Birden Fazla Bean Varsa Ne Olur? — @Qualifier Kullanımı
Spring, varsayılan olarak bean'leri türüne (type) göre enjekte eder. Aynı türden birden fazla bean tanımlıysa Spring hangisini enjekte edeceğini bilemez ve hata fırlatır:
NoUniqueBeanDefinitionException: expected single matching bean but found multiple
Bu durumda @Qualifier ile hangi bean'in kullanılacağını belirtmelisiniz:
@Autowired
@Qualifier("userRepositoryImpl")
private UserRepository userRepository;
2. @Autowired Neden Bazen Çalışmaz? — new ile Oluşturma Hatası
Eğer bir sınıfı new anahtar kelimesiyle manuel olarak oluşturursanız,
Spring bu nesneyi yönetmez ve dependency injection gerçekleşmez.
Field'lar null olarak kalır.
Çözüm:
- Sınıfı
@Component,@Serviceveya@Repositoryile işaretleyin - Nesneyi her zaman Spring Context üzerinden elde edin —
newkullanmayın
Sonuç: Hangi Injection Yöntemini Seçmeli?
Bu rehberde Spring @Autowired anotasyonunun ne olduğunu, nasıl çalıştığını ve üç farklı enjeksiyon yöntemini karşılaştırmalı olarak ele aldık.
Özet:
- Constructor Injection → zorunlu bağımlılıklar için en doğru yaklaşım
- Setter Injection → opsiyonel bağımlılıklar için kullanılabilir
- Field Injection → pratik görünse de production kodunda kaçınılmalı
Sık Sorulan Sorular (FAQ)
@Autowired nedir?
Spring Framework'te otomatik bağımlılık enjeksiyonu (Dependency Injection) yapmak için kullanılan anotasyondur. Spring Container, ilgili bean'i bulup otomatik olarak enjekte eder.
@Autowired yerine ne kullanılmalı?
Constructor injection tercih edilmelidir. Spring Boot'ta tek constructor varsa
@Autowired yazmaya bile gerek yoktur — Spring otomatik olarak enjekte eder.
Spring Boot'ta @Autowired zorunlu mu?
Hayır. Sınıfta yalnızca bir constructor varsa Spring, @Autowired olmadan da
bağımlılığı otomatik olarak enjekte eder.
Field injection neden önerilmiyor?
Field injection ile enjekte edilen bağımlılıklar Spring Context dışında null olarak kalır.
Bu durum unit test yazmayı zorlaştırır ve final keyword kullanımını engeller.
İlgili İçerikler
- DTO Nedir? DTO vs Entity Farkı
- Spring JPA: JOIN ve JOIN FETCH Farkı
- Java'da Loglama: SLF4J ve Log4j Nedir?
Son Güncelleme: 2025