Dependency Injection Yöntemleri

Eylem Gökdemir
3 min readMay 12, 2021

Merhabalar, bu yazıda ilk zamanlar çoğu junior developer gibi benim de anlamakta çok zorlandığım bir konu olan Dependency Injection’dan ve yöntemlerinden bahsedeceğim. Yazıdaki örnekleri Java ile Spring Framework üzerinden anlatacağım ancak temel düzeyde Java bilen her geliştiricinin anlayacağını düşünüyorum. O zaman hadi başlayalım.. 😊

Dependency Injection nedir?

Dependency Injection; bir nesnenin bağımlılıklarından kurtulmak veya o bağımlılıkları yönetme yoludur.

Peki bunu nasıl yapabiliriz? Gelin şimdi birlikte yazının asıl amacı olan Dependency Injection yöntemlerine göz atalım.

  • Property Injection

Bu yöntem; herhangi bir sınıfı, başka bir sınıfa bir property(özellik) olarak eklemek istediğimiz zaman kullanılır.

Örneğin aşağıdaki gibi bir service class’ımız olsun. Bunun bir service olduğunu belirtmek için tanımladan hemen önce isminin üstüne @Service anotasyonunu koyuyoruz ve içerisinde bize ‘Hello’ diyen bir getHello metodu tanımlıyoruz.

Şimdi de bu servise bağımlı başka bir sınıf örneği verelim. Aşağıdaki örnekte; MyService class’ından türeyen bir myService property’si yaratıldığını görüyoruz. Bu property’yi burada yaratmak zorundayız çünkü getHello metodunu çağırabilmek için ona ihtiyacımız var. İşte buna Property Injection diyoruz.

Not: Bu property’yi yaratmayı mümkün kılan şey @Autowired anotasyonudur.

  • Method Injection

Bu yöntem; bir öncekine çok benzemekle birlikte aslında onu metot versiyonu diyebiliriz özetle. Bir önceki yöntemimizde bağımlılığımız property iken burada metottur. Hemen bir örnekle açıklayalım.

Aşağıdaki örneğimizde daha önce yarattığımız servisi kullanan bir controller’ımız var. Yine bunun en üstüne de bir controller olduğunu belirtmek için @Controller anotasyonu koyuyoruz. Buradan yine bir önceki örnekteki gibi service property’sini tanımlıyoruz ancak bu defa bir de bu property için bir set metodu tanımlayıp property’yi onun içinde çağırıyor ve kullanıyoruz. Bağımlılığımız bu metot olduğunu belirtmek için de bu defa @Autowired anotasyonunu bu metodun üstüne koyuyoruz. Böylece artık myService property’sini çağırdığımız zaman uygulama buradaki myService property’sini kullanacaktır.

  • Constructor Injection

Son olarak bahsetmemiz gereken Dependency Injection yöntemi ise Constructor Injection yöntemidir. Bu yöntem; bağımlı olunan objenin constructor’da çağırılmasıdır. Aynı zamanda çoğu durum için kabul edilen en iyi Injection yöntemidir.

Aşağıda bir Constructor Injection örneği görüyoruz. Görüldüğü gibi burada bağımlı olunan nesnemiz tanımlanmış, constructor içerisinde kullanılmış ve sonra da kullanılmak istenen metotta çağırılıp ulaşılmak istenen metoda ulaşılmıştır. Diğer yöntemlere göre daha fazla tekrarlı kod varmış gibi gözükse de, her bir property için @Autowired anotasyonu kullanılmasına gerek olmaması bu yöntemin en büyük artılarından biridir.

Peki hangi yöntemi seçmeliyiz?

Constructor Injection yöntemi kodun okunabilirliğini artırdığından en kullanışlı yöntem olduğunu söyleyebiliriz. Çünkü her bir property için @Autowired anotasyonunu kullanmaya gerek yoktur. Ayrıca test edilebilirliği de kolaydır.

Ancak diyelim ki bir projede; bir A sınıfı bir de B sınıfı var ve A sınıfının B sınıfına bağımlılığı, B sınıfının da A sınıfına bağımlılığı var. Bu durumda Constructor Injection kullanırsak deadlock dediğimiz bir durum oluşur ve uygulama hata verir. Bu tip durumlarda Property Injection veya Method Injection kullanmayı tercih etmeliyiz.

Bu yazıda birçok mülakatta sorulan ve junior arkadaşlarımızın mutlaka bilmesi gereken bir konuyu bir junior dilinden/elinden anlatmaya çalıştım. Umarım anlattıklarım faydalı olmuştur. Hoşça kalın. 😊

--

--