Mari kita coba memahaminya melalui dua contoh.
Contoh 1
Pada hari-hari sebelumnya, aplikasi yang digunakan untuk membuat perintah meminta untuk menerima input pengguna satu demi satu. Saat ini, kerangka kerja UI membuat berbagai elemen UI, mengulang berbagai peristiwa elemen UI tersebut (seperti mouse hover, klik dll.) Dan program pengguna / utama menyediakan pengait (misalnya pendengar acara UI di Jawa) untuk mendengarkan acara tersebut. Jadi aliran elemen utama UI "kontrol" dipindahkan dari program pengguna ke kerangka UI. Pada hari-hari sebelumnya, itu dalam program pengguna.
Contoh 2
Pertimbangkan kelas di CustomerProcessor
bawah ini:
class CustomerProcessor
{
SqlCustRepo custRepo = new SqlCustRepo();
private void processCustomers()
{
Customers[] custs = custRepo.getAllCusts();
}
}
Jika saya ingin processCustomer()
mandiri dari implementasi apa pun getAllCusts()
, tidak hanya dari yang disediakan oleh SqlCustRepo
, saya akan perlu menyingkirkan garis: SqlCustRepo custRepo = new SqlCustRepo()
dan menggantinya dengan sesuatu yang lebih umum, mampu menerima beragam jenis implementasi, sehingga processCustomers()
hanya akan bekerja untuk implementasi yang disediakan. Kode di atas (instantiating class yang diperlukan SqlCustRepo
oleh logika program utama) adalah cara tradisional dan tidak mencapai tujuan decoupling processCustomers()
dari implementasi getAllCusts()
. Dalam inversi kontrol, wadah instantiates kelas implementasi yang diperlukan (seperti yang ditentukan oleh, katakanlah konfigurasi xml), menyuntikkannya dalam logika program utama yang akan terikat sesuai kait yang ditentukan (misalnya dengan @Autowired
penjelasan atau getBean()
metode dalam kerangka kerja pegas).
Mari kita lihat bagaimana ini bisa dilakukan. Pertimbangkan kode di bawah ini.
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");
}
}
Kita juga bisa punya
class GraphCustRepo implements ICustRepo { ... }
dan
<bean id="custRepo" class="GraphCustRepo">
dan kita tidak perlu mengubah App.java.
Di atas wadah (yang merupakan kerangka pegas) memiliki tanggung jawab untuk memindai file xml, membuat instance kacang jenis tertentu dan menyuntikkannya ke dalam program pengguna. Program pengguna tidak memiliki kontrol pada kelas mana yang dipakai.
PS: IoC adalah konsep umum dan dicapai dengan banyak cara. Contoh di atas mencapainya dengan injeksi ketergantungan.
Referensi: Artikel Martin Fowler .