一、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:執行程式
執行,測試結果為: