0Pricing
Java Academy · Ders

Yapıcı Enjeksiyonu ve Döngüsel Bağımlılıklar

Test edilebilirlik için yapıcı enjeksiyonunu tercih edin, döngüsel bağımlılıkları algılayın ve bunları @Lazy ile giderin.

Yapıcı Enjeksiyonu ve Döngüsel Bağımlılıklar, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Üç Enjeksiyon Türü

Spring; yapıcı enjeksiyonunu (önerilir), alan enjeksiyonunu (bir alan üzerinde @Autowired) ve ayarlayıcı enjeksiyonunu destekler. Yapıcı enjeksiyonu, test edilebilirlik ve değişmezlik açısından tercih edilir.

Yapıcı Enjeksiyonu

Bağımlılıkları yapıcı parametreleri olarak tanımlayın. Spring bunları otomatik olarak enjekte eder. Yalnızca bir yapıcı varsa @Autowired isteğe bağlıdır (Spring Boot 2.1+).

@Service
public class OrderService {
    private final OrderRepository repo;
    private final EmailService email;
    // @Autowired is optional when there is only one constructor
    public OrderService(OrderRepository repo, EmailService email) {
        this.repo  = repo;
        this.email = email;
    }
}

Yapıcı Enjeksiyonu Neden Tercih Edilir

Yapıcı enjeksiyonu: (1) bağımlılıklar final'dır — değişmezdir, (2) sınıf her zaman tamamen başlatılmıştır, (3) birim testlerinde Spring bağımlılığı yoktur — yalnızca new OrderService(mockRepo, mockEmail) çağrısını yapmanız yeterlidir.

// Unit test — no Spring context needed:
OrderRepository mockRepo  = mock(OrderRepository.class);
EmailService    mockEmail = mock(EmailService.class);
OrderService    service   = new OrderService(mockRepo, mockEmail);
// Test service logic directly

Alan Enjeksiyonu (Kaçının)

@Autowired ile alan enjeksiyonu kısa ve özdür; ancak sorunludur: alanlar final olamaz, bean oluşturma sonrasında tamamen başlatılmış olmaz ve birim testi için Spring veya Mockito'nun yansıtma yardımcıları gerekir.

// Avoid in production code:
@Service
public class UserService {
    @Autowired  // hidden dependency
    private UserRepository repo; // cannot be final
}

İsteğe Bağlı Bağımlılıklar için Ayarlayıcı Enjeksiyonu

Makul bir varsayılan değere sahip isteğe bağlı bağımlılıklar için ayarlayıcı enjeksiyonunu kullanın — ayarlayıcıyı @Autowired(required = false) ile işaretleyin.

@Service
public class NotificationService {
    private SmsSender smsSender; // optional
    @Autowired(required = false)
    public void setSmsSender(SmsSender s) { this.smsSender = s; }
}

Döngüsel Bağımlılık Nedir?

A'nın B'ye, B'nin de A'ya doğrudan veya geçişli olarak ihtiyaç duyması durumunda döngüsel bağımlılık oluşur. Spring bunu başlangıçta algılar ve BeanCurrentlyInCreationException fırlatır.

// CIRCULAR:
@Service class A { A(B b) {} }
@Service class B { B(A a) {} }
// Spring throws: BeanCurrentlyInCreationException: Is there an unresolvable circular reference?

Döngüselliği Giderme: Üçüncü Bir Hizmete Yeniden Düzenleme

En temiz çözüm, paylaşılan mantığı A'nın da B'nin de döngüsel olarak bağımlı olmadığı üçüncü bir hizmete çıkarmaktır.

// Before: A <-> B
// After: A -> C, B -> C (no cycle)
@Service class SharedLogic { ... }
@Service class A { A(SharedLogic s) {} }
@Service class B { B(SharedLogic s) {} }

Döngüselliği Giderme: @Lazy

Bir enjeksiyon noktasına @Lazy ek açıklamasını ekleyin. Spring hemen B için bir vekil oluşturur; gerçek B ise yalnızca A, B üzerindeki bir yöntemi ilk kez çağırdığında örneklenir.

@Service
public class A {
    private final B b;
    public A(@Lazy B b) { this.b = b; } // breaks the cycle
}

Döngüselliği Giderme: ApplicationContext Araması

Bir bean'e ApplicationContext enjekte edin ve diğer bean'i context.getBean() aracılığıyla tembel olarak arayın — ancak bu yaklaşım test edilebilirliği ve anlaşılırlığı azaltır.

@Service
public class A implements ApplicationContextAware {
    private ApplicationContext ctx;
    public void setApplicationContext(ApplicationContext c) { this.ctx = c; }
    public void doWork() { ctx.getBean(B.class).help(); }
}

Döngüselliği Gidermek için Ayarlayıcı Enjeksiyonu

Ayarlayıcıyla enjekte edilen bean'ler önce oluşturulur (oluşturma başarılı olur), ardından bağımlılıklar ayarlanır. Bu, değişebilirlik karşılığında döngüsel bağımlılıklara izin verir.

@Service
public class A {
    private B b;
    @Autowired public void setB(B b) { this.b = b; } // Spring sets after construction
}

spring.main.allow-circular-references (Spring Boot 2.6+)

Spring Boot 2.6+, döngüsel bağımlılıklara varsayılan olarak izin vermez. Yeniden düzenleme sırasında yalnızca geçici bir önlem olarak açıkça etkinleştirin: spring.main.allow-circular-references=true.

# application.properties (temporary workaround only):
spring.main.allow-circular-references=true

Hızlı Kontrol

Yapıcı enjeksiyonu neden alan enjeksiyonuna tercih edilir?

Özet

Yapıcı enjeksiyonunu tercih edin: değişmez, test edilebilir ve açıktır. Alan enjeksiyonundan kaçının. Döngüsel bağımlılıkları gidermek için @Lazy kullanın veya paylaşılan bir hizmet çıkarın. Spring Boot 2.6+, başlangıçta döngüsel başvuruları işaretler — bunları tasarım uyarıları olarak değerlendirin.

Sıkça Sorulan Sorular

“Yapıcı Enjeksiyonu ve Döngüsel Bağımlılıklar” dersi ücretsiz mi?

Evet — “Yapıcı Enjeksiyonu ve Döngüsel Bağımlılıklar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Yapıcı Enjeksiyonu ve Döngüsel Bağımlılıklar” dersinde ne öğreneceğim?

Test edilebilirlik için yapıcı enjeksiyonunu tercih edin, döngüsel bağımlılıkları algılayın ve bunları @Lazy ile giderin. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Yapıcı Enjeksiyonu ve Döngüsel Bağımlılıklar” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Otomatik Yapılandırma ve Spring Boot Başlatıcıları
  2. Uygulama Özellikleri ve Profiller
  3. Bean Bağlama: @Component, @Service, @Repository
  4. Yapıcı Enjeksiyonu ve Döngüsel Bağımlılıklar
← Java Academy Sayfasına Dön