天天看點

spring IOC 和 DI的意義

IOC:控制反轉,說白了就是把對象的建立、初始化、銷毀交給spring容器去完成

DI:依賴注入,即在運作期間有spring容器将依賴關系注入到元件之中(運作期間,由容器根據配置檔案,将其他對象的引用通過元件提供的setter或者constructor進行設定)

我覺得IOC和DI的意義就一句話:面向接口程式設計,減少了子產品之間的耦合性。

下面一個小例子來說明這個意義:

Document接口:

public interface Document {

void read();

void write();

}

ExcelDocument實作類:

public class ExcelDocument implements Document {

@Override

public void read() {

System.out.println("read excel");

}

@Override

public void write() {

System.out.println("write excel");

}

}

PdfDocument實作類:

public class PdfDocument implements Document {

@Override

public void read() {

System.out.println("read pdf");

}

@Override

public void write() {

System.out.println("write pdf");

}

}

WordDocument實作類:

public class WordDocument implements Document {

        @Override

        public void read() {

                System.out.println("read word");

        }

        @Override

        public void write() {

                System.out.println("write word");

        }

}

業務類 :

public class DocumentManager {

private Document document;

public DocumentManager(Document document) {

this.document = document;

}

public void read(){

this.document.read();

}

public void write(){

this.document.write();

}

}

配置檔案:

<?xml version="1.0" encoding="UTF-8"?>

<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.xsd">

        <bean id="documentManager" class="com.niit.service.DocumentManager">

                <constructor-arg ref="pdfDocument"/>

        </bean>

        <bean id="wordDocument" class="com.niit.service.impl.WordDocument"/>

        <bean id="pdfDocument" class="com.niit.service.impl.PdfDocument"/>

        <bean id="excelDocument" class="com.niit.service.impl.ExcelDocument"/>

</beans>

說明,面向接口程式設計,我們需要哪一個實作類,即将這個類注入到documentManager這個bean中;

最後在測試類中:

@Test

public void test(){

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

DocumentManager manager = (DocumentManager) context.getBean("documentManager");

manager.read();

manager.write();

}