天天看點

Spring(三)入門案例DI(依賴注入)

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

運作結果