Spring @Autowired Anotasyonu Nedir ve Nasıl Kullanılır?

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ı
  • 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 prensibi üzerine kuruludur. Bu sayede sınıflar, ihtiyaç duydukları bağımlılıkları kendileri oluşturmaz; Spring bu bağımlılıkları onlar adına sağlar.

Kısaca:

@Autowired = “Bu bağımlılığı Spring benim yerime enjekte etsin”

@Autowired anotasyonu aşağıdaki yerlerde kullanılabilir:

  • Alan (Field) enjeksiyonu
  • Setter metodu enjeksiyonu
  • Yapıcı (Constructor) enjeksiyonu

@Autowired Anotasyonu Nasıl Etkinleştirilir?

Spring Boot uygulamalarında ekstra bir ayar yapmanıza gerek yoktur. @SpringBootApplication anotasyonu sayesinde, Spring otomatik olarak bileşen taraması (component scanning) 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 – Önerilen

Constructor injection, Spring tarafından en çok önerilen bağımlılık enjeksiyonu yöntemidir.

@Service
@Transactional
public class AccountService {

    private final UserRepository userRepository;

    @Autowired
    public AccountService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

Avantajları:

  • Bağımlılıklar zorunlu hale gelir
  • Immutable (değiştirilemez) yapı sağlar
  • Test edilebilirlik artar

2. Setter Metodu Enjeksiyonu

Setter injection, bağımlılığın sonradan değiştirilmesi gereken durumlarda kullanılabilir.

@Service
@Transactional
public class AccountService {

    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

Ancak zorunlu bağımlılıklar için önerilmez.


3. Alan (Field) Enjeksiyonu

En sık kullanılan ama en az önerilen yöntemdir.

@Service
@Transactional
public class AccountService {

    @Autowired
    private UserRepository userRepository;
}

Dezavantajları:

  • Test yazmayı zorlaştırır
  • Bağımlılıklar gizlenir
  • Immutable yapı kurulamaz

@Autowired Kullanırken Bilmeniz Gerekenler

1. Birden Fazla Bean Varsa Ne Olur?

Spring, varsayılan olarak bean’leri türüne göre enjekte eder. Aynı türden birden fazla bean varsa:

NoUniqueBeanDefinitionException

Bu durumda @Qualifier kullanmalısınız:

@Autowired
@Qualifier("userRepositoryImpl")
private UserRepository userRepository;

2. @Autowired Neden Bazen Çalışmaz?

Eğer bir sınıfı new anahtar kelimesi ile manuel olarak oluşturursanız, Spring bu sınıfı yönetmez ve dependency injection gerçekleşmez.

Çözüm:

  • Sınıfı Spring bean’i yapın
  • Spring tarafından oluşturulmasını sağlayın

Sonuç

Bu yazıda, Spring @Autowired anotasyonunun ne olduğunu, nasıl çalıştığını ve farklı enjeksiyon yöntemlerini detaylı şekilde ele aldık.

Özetle:

  • Constructor Injection → en doğru yaklaşım
  • Setter Injection → opsiyonel bağımlılıklar
  • Field Injection → mümkünse kaçınılmalı

Sık Sorulan Sorular (FAQ)

@Autowired nedir?

Spring Framework’te otomatik bağımlılık enjeksiyonu yapmak için kullanılan anotasyondur.

@Autowired yerine ne kullanılmalı?

Constructor injection tercih edilmeli, mümkünse @Autowired bile yazılmadan yapıcı üzerinden enjeksiyon yapılmalıdır.

Spring Boot’ta @Autowired zorunlu mu?

Hayır. Tek constructor varsa Spring otomatik olarak enjeksiyon yapar.


İlgili İçerikler

Son Güncelleme: 2025

İyi çalışmalar ve başarılar! 🚀

Beğendiysen bir çay ısmarlayabilirsin ☕

Bana çay ısmarla

Spring Boot ile ilgili yorumlar

Yorum Paylaş

EMail Zorunlu alanlar * *