DI介紹
DI (Dependency Injection) 依賴注入
首先要明白:
is a:自己是一個什麼,在程式中即繼承或接口,比如汽車是交通工具。
has a:有一個,程式中即有一個成員變量,換句話說就是類B中的代碼有對類A的引用
class B{
private A a;//B類依賴A類
依賴注入解釋
依賴:一個對象需要使用另一個對象
注入:通過setter方法進行另一個對象執行個體設定。
- 例如:
class BookServiceImpl{
//之前開發:接口 = 實作類 (service和dao耦合)
//private BookDao bookDao = new BookDaoImpl();
//學習spring之後 (解耦:service實作類使用dao接口,不知道具體的實作類)
private
要想使用DI 一定要為字段提供setter方法
模拟spring執行過程
建立service執行個體:BookService bookService = new BookServiceImpl() -->IoC 配置資訊(bean)
建立dao執行個體:BookDao bookDao = new BookDaoImple() -->IoC 配置資訊(bean)
将dao設定給service:bookService.setBookDao(bookDao); -->DI 配置資訊(property)
目标類
建立目标類的過程為:
* 建立BookService接口和實作類
* 建立BookDao接口和實作類
* 将dao和service配置xml到檔案
建立BookService接口和實作類
package com.scx.di.test;
public interface BookService {
public void addBook();
}
package com.scx.di.test;
public class BookServiceImpl implements BookService{
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void addBook() {
bookDao.addBook();
}
}
建立BookDao接口和實作類
package com.scx.di.test;
public interface BookDao {
public void addBook();
}
package com.scx.di.test;
public class BookDaoImpl implements BookDao{
@Override
public void addBook() {
System.out.println("BookDaoImpl add a book.");
}
}
将dao和service配置xml到檔案
模拟Spring過程
<?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 definitions here -->
<bean id="BookServiceId" class="com.scx.di.test.BookServiceImpl">
<property name="bookDao" ref="BookDaoId"></property>
</bean>
<bean id="BookDaoId" class="com.scx.di.test.BookDaoImpl"></bean>
</beans>
Junit測試
package com.scx.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.scx.di.test.BookDao;
import com.scx.di.test.BookDaoImpl;
import com.scx.di.test.BookService;
import com.scx.di.test.BookServiceImpl;
public class TestDI {
@Test
public void testDI(){
//之前開發
BookDao bookDao=new BookDaoImpl();
BookServiceImpl bookService1=new BookServiceImpl();
bookService1.setBookDao(bookDao);
bookService1.addBook();
//學習Spring後
String xmlPath="com/scx/di/test/applicationContext.xml";
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);
BookService bookService2=applicationContext.getBean("BookServiceId",BookService.class);
bookService2.addBook();