Spring Framework'te Bağımlılık Enjeksiyonu ve Kontrolü Ters Çevirme Nedir?


112

"Bağımlılık Enjeksiyonu" ve "Kontrolü Ters Çevirme" genellikle Web çerçevelerini geliştirmek için Yay çerçevesini kullanmanın başlıca avantajları olarak bahsedilir

Mümkünse bunun ne olduğunu çok basit bir şekilde bir örnekle açıklayabilir mi?



3
@SteveChambers onun kopyası değil, bu soru Springs Perspective'de soruldu. Bu soru genel olarak öngörülmektedir.
VdeX

Yanıtlar:


233
  • Yay, Bağımlılık Enjeksiyonu nedeniyle gevşek bağlı uygulamaların oluşturulmasına yardımcı olur .
  • İlkbaharda, nesneler ilişkilerini (bağımlılıkları) tanımlar ve bu bağımlılıkları nasıl elde edecekleri konusunda endişelenmezler . Nesnelerin oluşturulması için gerekli bağımlılıkları sağlamak Spring'in sorumluluğundadır.

Örneğin : Bir nesnemiz olduğunu Employeeve nesneye bağımlı olduğunu varsayalım Address. EmployeeNesneye bağımlılığını tanımlayacak buna karşılık gelen bir fasulye tanımlayacağız Address.

Spring bir Employeenesne yaratmaya çalıştığında , bunun Employeebağımlılığı Addressolduğunu görecek, bu yüzden önce Addressnesneyi (bağımlı nesne) oluşturacak ve sonra nesneye enjekte edecektir Employee.

  • Kontrolün Ters Çevrilmesi ( IoC ) ve Bağımlılık Enjeksiyonu ( DI ) birbirinin yerine kullanılır. IoC, DI aracılığıyla elde edilir. DI, bağımlılıkları sağlama sürecidir ve IoC, DI'nin nihai sonucudur. ( Not: DI, IoC'ye ulaşmanın tek yolu değildir. Başka yollar da vardır.)

  • DI tarafından, nesne yaratma sorumluluğu uygulama kodumuzdan Yaylı konteynere kaydırılır; bu fenomen IoC olarak adlandırılır.

  • Bağımlılık Enjeksiyonu, ayarlayıcı enjeksiyon veya yapıcı enjeksiyon ile yapılabilir.

Katılmıyorum. Bunun net bir açıklama olduğunu sanmıyorum. Neden onu oluşturmak ve enjekte etmek için bir çerçeve almak yerine "Çalışan" içinde "Adres" i somutlaştıramıyorsunuz? Biraz daha detaylı bir örnek isteniyor.
Boris

2
@Boris Kimse kendi nesnelerinizi başlatamayacağınızı söylemedi. Ancak cevabın tek amacı, DI ile aynı şeyi nasıl başarabileceğinizi göstermekti. İstemci kodu ile hem DI hem de nesnelerin somutlaştırılmasına sahip olabilirsiniz. Bu, en azından kısmen IOC olarak adlandırılacaktır.
bogdan.rusu


Boris. Çok kıskanç? Şimdiye kadarki en iyi cevap bu.
Aniket Kapse

31

Bu iki terimle ilgili basit anlayışımı yazacağım: (Hızlı anlamak için örnekleri okuyun)

  • Bağımlılık Enjeksiyonu (DI):
    Bağımlılık enjeksiyonu genellikle , yöntemin bağımlı nesneyi oluşturmasını sağlamak yerine, bağımlı bir nesneyi bir yönteme parametre olarak iletmek anlamına gelir .
    Pratikte anlamı, yöntemin belirli bir uygulamaya doğrudan bağımlı olmamasıdır; gereksinimleri karşılayan herhangi bir uygulama bir parametre olarak geçirilebilir.

    Nesnelerin bu uygulaması ile bağımlılıklarını tanımlar. Ve bahar bunu mümkün kılar.
    Bu, gevşek bağlı uygulama geliştirmeye yol açar.

    Hızlı Örnek: ÇALIŞAN NESNESİ OLUŞTURULDUĞUNDA, OTOMATİK OLARAK ADRES NESNESİ OLUŞTURACAKTIR (eğer adres Çalışan nesnesi tarafından bağımlılık olarak tanımlanırsa) *.

  • Kontrolün Tersine Çevrilmesi (IoC) Konteyneri:
    Bu, çerçevelerin ortak bir özelliğidir, IoC , BeanFactory aracılığıyla başlatmadan yıkıma kadar java nesnelerini yönetir
    .
    - IoC konteyneri tarafından örneklenen Java bileşenlerine fasulye denir ve IoC konteyneri, bir fasulyenin kapsamını, yaşam döngüsü olaylarını ve yapılandırıldığı ve kodlandığı tüm AOP özelliklerini yönetir .

    QUICK EXAMPLE:Inversion of Control is about getting freedom, more flexibility, and less dependency. When you are using a desktop computer, you are slaved (or say, controlled). You have to sit before a screen and look at it. Using keyboard to type and using mouse to navigate. And a bad written software can slave you even more. If you replaced your desktop with a laptop, then you somewhat inverted control. You can easily take it and move around. So now you can control where you are with your computer, instead of computer controlling it.

    Kontrolün Tersine Çevrilmesini uygulayarak, bir yazılım / nesne tüketicisi, kontrol edilmek veya daha az seçeneğe sahip olmak yerine yazılım / nesneler üzerinde daha fazla kontrol / seçenek elde eder.

    Kontrolün bir tasarım kılavuzu olarak tersine çevrilmesi aşağıdaki amaçlara hizmet eder:
    - Belirli bir görevin yürütülmesinde uygulamadan ayrılma söz konusudur.
    - Her modül ne için tasarlandığına odaklanabilir.
    - Modüller, diğer sistemlerin ne yaptığı konusunda hiçbir varsayımda bulunmaz, ancak sözleşmelerine güvenir.
    - Modülleri değiştirmenin diğer modüller üzerinde hiçbir yan etkisi yoktur

Konuyu burada soyut tutacağım, konunun detaylı anlaşılması için aşağıdaki bağlantıları ziyaret edebilirsiniz.

Örnekle iyi bir okuma

Detaylı açıklama


11

Spring Objects gevşek bir şekilde bağlanmıştır, yani her sınıf birbirinden bağımsızdır, böylece her şey ayrı ayrı test edilebilir. Ancak bu sınıfları kullanırken, bir sınıf, önce somutlaştırılması gereken diğer sınıflara bağımlı olabilir.

Bu nedenle, spring'e A sınıfının B sınıfına bağlı olduğunu söyleriz. Dolayısıyla, A sınıfı için fasulye (sınıf gibi) oluştururken, A sınıfından önce B sınıfını başlatır ve bunu A sınıfına setter veya yapıcı DI yöntemlerini kullanarak enjekte eder. Yani, ilkbahara çalışma anındaki bağımlılığı anlatıyoruz. Bu DI.

Nesneleri (fasulyeleri) oluşturma, onları ve toplamalarını sabit kodlama yerine Spring'e koruma sorumluluğunu verdiğimiz için buna Inversion Of Control (IOC) diyoruz.


7

Kontrolü Ters Çevirme (IOC):

IoC , bir sistemdeki kontrol akışının tersine çevrilmesini tanımlayan bir tasarım modelidir, bu nedenle yürütme akışı merkezi bir kod parçası tarafından kontrol edilmez. Bu, bileşenlerin yalnızca diğer bileşenlerin soyutlamalarına bağlı olması gerektiği ve bağımlı nesnelerin oluşturulmasından sorumlu olmadığı anlamına gelir. Bunun yerine, nesne örnekleri, Dependency Injection (DI) aracılığıyla bir IoC konteyneri tarafından çalışma zamanında sağlanır.

IoC, yeniden kullanımı, gevşek bağlanmayı ve yazılım bileşenlerinin kolay test edilmesini kolaylaştıran daha iyi yazılım tasarımı sağlar.

Bağımlılık Enjeksiyonu (DI):

DI , bağımlılıkları bir nesnenin yapıcısına geçirme tekniğidir. Nesne konteynerden yüklenmişse, bağımlılıkları konteyner tarafından otomatik olarak sağlanacaktır. Bu, manuel olarak bir örnek oluşturmak zorunda kalmadan bir bağımlılığı kullanmanıza olanak tanır. Bu, birleştirmeyi azaltır ve nesne örneklerinin ömrü üzerinde size daha fazla kontrol sağlar.

daha fazlasını görmek için tıklayın


6

İlkbahar: Yay, Java Platformu için "Denetimin Tersine Çevrilmesi" kapsayıcısıdır.

Kontrolün Tersine Çevrilmesi (IoC): Kontrolün Tersine Çevrilmesi (IoC), nesne birleştirme işleminin çalışma zamanında bir "birleştirici" nesnesiyle sınırlandırıldığı ve tipik olarak statik analiz kullanılarak derleme zamanında bilinemeyen nesne yönelimli bir programlama uygulamasıdır.

Bağımlılık Enjeksiyonu (DI): "Bağımlılık ekleme, sabit kodlanmış bağımlılıkların kaldırılmasına izin veren ve ister çalışma anında ister derleme zamanında değiştirmeyi mümkün kılan bir yazılım tasarım modelidir." -wiki.


Bu, halihazırda mevcut olandan nasıl daha basittir (bu cevabın kaynağı budur)? Terminolojiler etrafındaki çift alıntılar işleri sihirli bir şekilde basitleştirmedikçe, OP'nin basitlik talebini hesaba katmaz.
Ekim 2018

6

Kontrolün tersine çevrilmesi - Bahar çekirdeklerini Spring IOC kabına oluşturma ve örnekleme kontrolünü vermek anlamına gelir ve geliştiricinin yaptığı tek iş, yay xml dosyasındaki çekirdekleri yapılandırmaktır.

Bağımlılık enjeksiyonu

Bir sınıf çalışanı düşünün

class Employee { 
   private int id;
   private String name;
   private Address address;

   Employee() {
     id = 10;
     name="name";
     address = new Address();
   }


}

ve sınıf adresini dikkate alın

class Address {
   private String street;
   private String city;

   Address() {
     street="test";
     city="test1";

  }
}

Yukarıdaki kodda, adres sınıfı değerleri yalnızca Employee sınıfı başlatıldığında ayarlanır, bu da Employee sınıfındaki Address sınıfının bağımlılığıdır. Yay, bu bağımlılığı enjekte etmek için iki yol sağlayarak Bağımlılık Enjeksiyonu konseptini kullanarak bu sorunu çözer.

  1. Setter enjeksiyon

Employee sınıfında, Address sınıfının bir referansını alan setter yöntemi

public void setAddress(Address addr) {
    this.address = addr;
}
  1. Yapıcı enjeksiyon

Employee sınıfında Adres kabul eden kurucu

Employee(Address addr) {
      this.address = addr;
}

Bu şekilde, Adres sınıfı değerleri, ayarlayıcı / yapıcı enjeksiyonu kullanılarak bağımsız olarak ayarlanabilir.


3

Denetimin Tersine Çevrilmesi, bakımı kolay, yeniden kullanılabilir, modüler yazılım çerçeveleri oluşturmaya yardımcı olan yazılım mimarisinin genel bir tasarım ilkesidir.

Kontrol Akışının genel olarak yazılmış kitaplıktan veya yeniden kullanılabilir koddan "alındığı" bir tasarım ilkesidir.

Daha iyi anlamak için, önceki kodlama günlerimizde nasıl kodlama yaptığımızı görelim. Prosedürel / geleneksel dillerde, iş mantığı genellikle uygulamanın akışını kontrol eder ve genel veya yeniden kullanılabilir kodu / fonksiyonları "Çağır". Örneğin, basit bir Konsol uygulamasında, kontrol akışım programımın talimatları tarafından kontrol edilir, bu talimatlar bazı genel yeniden kullanılabilir işlevlere yapılan çağrıları içerebilir.

print ("Please enter your name:");
scan (&name);
print ("Please enter your DOB:");
scan (&dob);

//More print and scan statements
<Do Something Interesting>

//Call a Library function to find the age (common code)
print Age

Buna karşılık, IoC ile Çerçeveler, iş mantığını "Çağıran" yeniden kullanılabilir koddur.

Örneğin, Windows tabanlı bir sistemde, düğmeler, menüler, pencereler ve iletişim kutuları gibi UI öğeleri oluşturmak için bir çerçeve zaten mevcut olacaktır. Uygulamamın iş mantığını yazdığımda, çerçevenin olayları iş mantığı kodumu çağıracak (bir olay tetiklendiğinde) ve tersi DEĞİL.

Çerçevenin kodu iş mantığımın farkında olmasa da, yine de kodumu nasıl arayacağını bilecektir. Bu, olaylar / temsilciler, geri aramalar, vb. Kullanılarak elde edilir. Burada Akışın Kontrolü "Tersine Çevrilmiştir".

Bu nedenle, statik olarak bağlı nesneler üzerindeki kontrol akışına bağlı olmak yerine, akış genel nesne grafiğine ve farklı nesneler arasındaki ilişkilere bağlıdır.

Bağımlılık Enjeksiyonu, nesnelerin bağımlılıklarını çözmek için IoC ilkesini uygulayan bir tasarım modelidir.

Daha basit bir deyişle, kod yazmaya çalışırken, farklı sınıflar oluşturuyor ve kullanıyor olacaksınız. Bir sınıf (Sınıf A) diğer sınıfları (Sınıf B ve / veya D) kullanabilir. Yani, Sınıf B ve D, A sınıfının bağımlılıklarıdır.

Basit bir benzetme, sınıf Araba olacaktır. Bir araba, Motor, Lastikler ve daha fazlası gibi diğer sınıflara bağlı olabilir.

Bağımlılık Enjeksiyonu, Bağımlı sınıfların (burada Sınıf Araba) bağımlılıklarını (Sınıf Motoru ve Lastik sınıfı) oluşturması yerine, bağımlılığın somut örneğiyle sınıfa enjekte edilmesi gerektiğini önerir.

Daha pratik bir örnekle anlayalım. Kendi TextEditor'ınızı yazdığınızı düşünün. Diğer şeylerin yanı sıra, kullanıcıya metnindeki yazım hatalarını kontrol etme olanağı sağlayan bir yazım denetleyicisine sahip olabilirsiniz. Böyle bir kodun basit bir uygulaması şunlar olabilir:

Class TextEditor
{

    //Lot of rocket science to create the Editor goes here

    EnglishSpellChecker objSpellCheck;
    String text;

    public void TextEditor()

    {   

        objSpellCheck = new EnglishSpellChecker();

    }

    public ArrayList <typos> CheckSpellings()
    {

        //return Typos;

    }

}

İlk bakışta her şey pembe görünüyor. Kullanıcı bazı metinler yazacaktır. Geliştirici metni yakalayacak ve Yazım Denetimi işlevini çağıracak ve Kullanıcıya göstereceği Yazım Hatalarının bir listesini bulacaktır.

Editör'de bir kullanıcı Fransızca yazmaya başladığında güzel bir güne kadar her şey harika çalışıyor gibi görünüyor.

Daha fazla dil desteği sağlamak için daha fazla Yazım Denetleyicisine ihtiyacımız var. Muhtemelen Fransızca, Almanca, İspanyolca vs.

Burada, TextEditor sınıfımızla sıkı bir şekilde birleştirilen "English" SpellChecker ile sıkı bir şekilde bağlanmış bir kod oluşturduk; bu, TextEditor sınıfımızın EnglishSpellChecker'a bağımlı olduğu veya başka bir deyişle EnglishSpellCheker'ın TextEditor için bağımlı olduğu anlamına gelir. Bu bağımlılığı kaldırmamız gerekiyor. Ayrıca, Metin Düzenleyicimizin, geliştiricinin çalışma zamanında takdirine bağlı olarak herhangi bir Yazım Denetleyicisinin somut referansını tutacak bir yola ihtiyacı vardır.

Öyleyse, DI'nin girişinde gördüğümüz gibi, sınıfa bağımlılıkları enjekte edilmesi gerektiğini önermektedir. Bu nedenle, çağrılan sınıfa / koda tüm bağımlılıkları enjekte etmek çağıran kodun sorumluluğunda olmalıdır. Böylece kodumuzu şu şekilde yeniden yapılandırabiliriz:

interface ISpellChecker
{

    Arraylist<typos> CheckSpelling(string Text);

}

Class EnglishSpellChecker : ISpellChecker

{

    public override Arraylist<typos> CheckSpelling(string Text)

    {

        //All Magic goes here.

    }

}



Class FrenchSpellChecker : ISpellChecker

{

    public override Arraylist<typos> CheckSpelling(string Text)

    {

        //All Magic goes here.

    }

}

Örneğimizde, TextEditor sınıfı ISpellChecker türünün somut örneğini almalıdır.

Artık bağımlılık Oluşturucuya, Genel Mülkiyete veya bir yönteme enjekte edilebilir.

Constructor DI kullanarak sınıfımızı değiştirmeyi deneyelim. Değiştirilen TextEditor sınıfı şuna benzer:

Class TextEditor

{

    ISpellChecker objSpellChecker;

    string Text;



    public void TextEditor(ISpellChecker objSC)

    {

        objSpellChecker = objSC;

    }



    public ArrayList <typos> CheckSpellings()

    {

        return objSpellChecker.CheckSpelling();

    }

}

Böylece, metin düzenleyiciyi oluştururken çağıran kod, TextEditor örneğine uygun Yazım Denetleyici Türünü enjekte edebilir.

Sen tam makalemizi okuyabilirsiniz burada


1

Employee'de adres örneği almanın geleneksel yolu, Address sınıfının yeni bir örneğini oluşturmaktır. Bahar, tüm bağımlı nesneleri yaratır, bu nedenle nesne hakkında endişelenmemize gerek yoktur.

Yani baharda bize bağımlılık nesnesini sağlayan yaylı konteynere bağımlıyız.


1

IOC, bir başkasının sizin için nesneyi yaratmasına izin verdiğiniz tekniktir. Ve bahar durumunda bir başkası IOC konteyneri.

Bağımlılık Enjeksiyonu, bir nesnenin başka bir nesnenin bağımlılığını sağladığı bir tekniktir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.