İki örnekle anlamaya çalışalım.
örnek 1
Daha önceki günlerde, komut üretmek için kullanılan uygulamalar, kullanıcı girişlerini birbiri ardına kabul etmek ister. Bugün, UI çerçeveleri çeşitli UI öğelerini başlatır, bu UI öğelerinin çeşitli olaylarını (fare vurgusu, tıklama vb.) Geçirir ve kullanıcı / ana programlar bu olayları dinlemek için kancalar (örneğin, Java'daki UI olay dinleyicileri) sağlar. Böylece, ana UI eleman akışı "kontrol", kullanıcı programından UI çerçevesine taşınır. Daha önceki günlerde, kullanıcı programındaydı.
Örnek 2
CustomerProcessor
Aşağıdaki sınıfı düşünün :
class CustomerProcessor
{
SqlCustRepo custRepo = new SqlCustRepo();
private void processCustomers()
{
Customers[] custs = custRepo.getAllCusts();
}
}
Eğer sadece sağladığım processCustomer()
herhangi bir uygulamadan bağımsız olmak istersem , hattan kurtulmam gerekecek ve onu daha genel bir şeyle değiştirmeliyim, çeşitli uygulama türlerini kabul edebilecek, bunun için sadece çalışacak sağlanan herhangi bir uygulama. Yukarıdaki kod ( ana program mantığına göre zorunlu sınıfın somutlaştırılması ) geleneksel bir yöntemdir ve uygulamasından ayrılma amacına ulaşmamaktadır . Kontrolün tersine, kap, istenen uygulama sınıfını başlatır (xml konfigürasyonu ile belirtildiği gibi), onu belirtilen kancalara göre bağlanan ana program mantığına enjekte eder (örneğin , yay çerçevesindeki açıklama veya yöntemle).getAllCusts()
SqlCustRepo
SqlCustRepo custRepo = new SqlCustRepo()
processCustomers()
SqlCustRepo
processCustomers()
getAllCusts()
@Autowired
getBean()
Bunun nasıl yapılabileceğini görelim. Aşağıdaki kodu düşünün.
config.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="custRepo" class="JsonCustRepo" />
</beans>
CustRepo.java
interface ICustRepo
{ ... }
JsonCustRepo.java
class JsonCustRepo implements CustRepo
{ ... }
App.java
class App
{
public static void main(String[] args)
{
ApplicationContext context = new ClassPathXmlApplicationContext("Config.xml");
ICustRepo custRepo = (JsonCustRepo) context.getBean("custRepo");
}
}
Biz de olabilir
class GraphCustRepo implements ICustRepo { ... }
ve
<bean id="custRepo" class="GraphCustRepo">
ve App.java'yı değiştirmemize gerek kalmayacak.
Kabın üstünde (yay çerçevesi olan) xml dosyasını tarama, belirli tipteki fasulyeyi örnekleme ve kullanıcı programına enjekte etme sorumluluğu vardır. Kullanıcı programının hangi sınıfın başlatıldığının kontrolü yok.
Not: IoC genel bir kavramdır ve birçok yönden elde edilir. Yukarıdaki örneklere bağımlılık enjeksiyonuyla ulaşılmaktadır.
Kaynak: Martin Fowler'in makalesi .