Java開發學習(二)----IOC、DI入門案例

2022-05-31 06:01:46

一、IOC入門案例

1.1 思路分析

(1)Spring是使用容器來管理bean物件的,那麼管什麼?

  • 主要管理專案中所使用到的類物件,比如(Service和Dao)

(2)如何將被管理的物件告知IOC容器?

  • 使用組態檔

(3)被管理的物件交給IOC容器,要想從容器中獲取物件,就先得思考如何獲取到IOC容器?

  • Spring框架提供相應的介面

(4)IOC容器得到後,如何從容器中獲取bean?

  • 呼叫Spring框架提供對應介面中的方法

(5)使用Spring匯入哪些座標?

  • 用別人的東西,就需要在pom.xml新增對應的依賴

1.2 程式碼實現

需求分析:將BookServiceImpl和BookDaoImpl交給Spring管理,並從容器中獲取對應的bean物件進行方法呼叫。

1.建立Maven的java專案

2.pom.xml新增Spring的依賴jar包

3.建立BookService,BookServiceImpl,BookDao和BookDaoImpl四個類

4.resources下新增spring組態檔,並完成bean的設定

5.使用Spring提供的介面完成IOC容器的建立

6.從容器中獲取物件進行方法呼叫

步驟1:建立Maven專案

步驟2:新增Spring的依賴jar包

pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

步驟3:新增案例中需要的類

建立BookService,BookServiceImpl,BookDao和BookDaoImpl四個類

public interface BookDao {
    public void save();
}
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
}
public interface BookService {
    public void save();
}
public class BookServiceImpl implements BookService {
    private BookDao bookDao = new BookDaoImpl();
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}

步驟4:新增spring組態檔

這個功能是商業版才有的功能,瞭解一下即可

resources下新增spring組態檔applicationContext.xml,並完成bean的設定

步驟5:在組態檔中完成bean的設定

<?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標籤標示設定bean
        id屬性標示給bean起名字
        class屬性表示給bean定義型別
    -->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"/>
​
</beans>

注意事項:bean定義時id屬性在同一個上下文中(組態檔)不能重複

步驟6:獲取IOC容器

使用Spring提供的介面完成IOC容器的建立,建立App類,編寫main方法

public class App {
    public static void main(String[] args) {
        //獲取IOC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    }
}

步驟7:從容器中獲取物件進行方法呼叫

public class App {
    public static void main(String[] args) {
        //獲取IOC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
//        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
//        bookDao.save();
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
    }
}

步驟8:執行程式

測試結果為:

Spring的IOC入門案例已經完成,但是在BookServiceImpl的類中依然存在BookDaoImpl物件的new操作,它們之間的耦合度還是比較高,這塊該如何解決,就需要用到下面的DI:依賴注入

二、DI入門案例

2.1 思路分析

(1)要想實現依賴注入,必須要基於IOC管理Bean

  • DI的入門案例要依賴於前面IOC的入門案例

(2)Service中使用new形式建立的Dao物件是否保留?

  • 需要刪除掉,最終要使用IOC容器中的bean物件

(3)Service中需要的Dao物件如何進入到Service中?

  • 在Service中提供方法,讓Spring的IOC容器可以通過該方法傳入bean物件

(4)Service與Dao間的關係如何描述?

  • 使用組態檔

2.2 程式碼實現

需求:基於IOC入門案例,在BookServiceImpl類中刪除new物件的方式,使用Spring的DI完成Dao層的注入

1.刪除業務層中使用new的方式建立的dao物件

2.在業務層提供BookDao的setter方法

3.在組態檔中新增依賴注入的設定

4.執行程式呼叫方法

步驟1: 去除程式碼中的new

在BookServiceImpl類中,刪除業務層中使用new的方式建立的dao物件

public class BookServiceImpl implements BookService {
    //刪除業務層中使用new的方式建立的dao物件
    private BookDao bookDao;
​
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}

步驟2:為屬性提供setter方法

在BookServiceImpl類中,為BookDao提供setter方法,為容器提供呼叫

public class BookServiceImpl implements BookService {
    //刪除業務層中使用new的方式建立的dao物件
    private BookDao bookDao;
​
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
    //提供對應的set方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}
​

步驟3:修改設定完成注入

在組態檔中新增依賴注入的設定

<?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標籤標示設定bean
        id屬性標示給bean起名字
        class屬性表示給bean定義型別
    -->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
​
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <!--設定server與dao的關係-->
        <!--property標籤表示設定當前bean的屬性
                name屬性表示設定哪一個具體的屬性
                ref屬性表示參照哪一個bean
        -->
        <property name="bookDao" ref="bookDao"/>
    </bean>
​
</beans>

注意:設定中的兩個bookDao的含義是不一樣的

  • name="bookDao"中bookDao的作用是讓Spring的IOC容器在獲取到名稱後,將首字母大寫,前面加set找對應的setBookDao()方法進行物件注入

  • ref="bookDao"中bookDao的作用是讓Spring能在IOC容器中找到id為bookDao的Bean物件給bookService進行注入

  • 綜上所述,對應關係如下:

步驟4:執行程式

執行,測試結果為: