Spring @Autowired Nedir? Constructor, Setter ve Field Injection (2025)

İngilizce'ye Geç

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:


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, @Component anotasyonlu 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 — final kullanı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 — final kullanı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, @Service veya @Repository ile işaretleyin
  • Nesneyi her zaman Spring Context üzerinden elde edin — new kullanmayı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

Son Güncelleme: 2025

Latest Software Developers - Yazılım Blog Yazarı Profil Resmi

Yazar

LatestSoftwareDevelopers

Güncel yazılım teknolojilerinin takip edildiği blog.

Spring Boot ile ilgili yorumlar

Yorum Paylaş

EMail Zorunlu alanlar * *