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();
}