IOC與生命週期

weixin_34321977發表於2018-08-01

IOC解決:耦合問題

耦合問題(分層開發中)
持久層類:UserDAO
服務層類:UserService{
Public void add(){
UserDAO dao = new UserDAO();//層與層之間的耦合
Dao.addUser();
}
}

解耦(建立物件的工作交給Spring容器來管理)
面向介面程式設計
持久層類:UserDAO介面 UserDAOImpl
服務層類:UserService{
Public void add(){
UserDAO dao = // Spring的容器注入具體的實現類
//介面
dao.addUser();
}
}
未來只需要在依賴其他層物件的地方,僅需要定義介面,然後後Spring容器注入具體的實現。不再需要在多個service建立具體的依賴物件。建立物件的工作交給Spring

Inverse of Control,控制反轉,將物件的建立權反轉給Spring

本質:IOC就是建立物件

實踐
1,POM引入包
2,編寫介面與實現類
3,配置Spring核心配置applicationContext.xml
spring-framework-4.3.6.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
4,測試

開發流程
第一步:建立Maven專案,匯入依賴
加入Spring的依賴包

我們把所有spring相關的的依賴全部放到pom.xml


<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>4.3.11.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
  <version>4.3.11.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>4.3.11.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>4.3.11.RELEASE</version>
</dependency>

<!-- 為了方便進行單元測試,新增spring-test包 -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>4.3.11.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aspects</artifactId>
  <version>4.3.11.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-expression</artifactId>
  <version>4.3.11.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-orm</artifactId>
  <version>4.3.11.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
  <version>4.3.11.RELEASE</version>
</dependency>
<!--  jms -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jms</artifactId>
  <version>4.3.11.RELEASE</version>
</dependency>

<!--新增aspectjweaver包 -->
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.8.5</version>
</dependency>
6217104-530404b55d098cba.png
image.png

第二步:編寫持久層的介面和實現類
public interface IocDao {
void addUser();
}

實現類如下所示:

public class IocDaoImpl implements IocDao {
@Override
public void addUser() {
Log.debug("我是IocDaoImpl 中的addUser方法");
}
public void init(){
Log.debug("我是初始化");
}
public void destory(){
Log.debug("我是銷燬");
}
}

第三步:建立Spring的核心配置檔案 applicationContext.xml

對於常用的模板可以在idea裡面加入模板檔案

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">

</beans>

並在 beans 標籤內部加入
<bean id="iocDaoBean" class="com.zyh.dao.impl.IocDaoImpl" init-method="init" destroy-method="destory">

</bean>

測試程式碼如下所示:

@Test
public void testIocDaoImpl(){
    ClassPathXmlApplicationContext classPathXmlApplicationContext=new ClassPathXmlApplicationContext("applicationContext2.xml");
    IocDaoImpl iocDao = (IocDaoImpl) classPathXmlApplicationContext.getBean("iocDaoBean");
    iocDao.addUser();
    IocDaoImpl iocDao1= (IocDaoImpl) classPathXmlApplicationContext.getBean("iocDaoBean");
    IocDaoImpl iocDao2= (IocDaoImpl) classPathXmlApplicationContext.getBean("iocDaoBean");
    Log.error(iocDao1);
    Log.error(iocDao2);
    classPathXmlApplicationContext.close();
}

觀察結果輸出如下 :


6217104-1962dc045bf53908.png
image.png

Spring核心配置
Bean管理與生命週期:

<bean id="iocDaoBean" class="com.zyh.dao.impl.IocDaoImpl" init-method="init" destroy-method="destory" scope="singleton“ >

id="iocDaoBean" //當前物件的別名,唯一標示。
class="com.zyh.dao.impl.IocDaoImpl" //需要建立的例項化物件的類
init-method="init" // 自定義初始化方法
destroy-method="destory" //銷燬物件的時候會呼叫自定義銷燬方法
需要特殊注意的是 scope 作用域 :
scope:範圍(作用域)
prototype 多例物件(銷燬由業務方自己管理)
singleton 單例物件 預設

生命週期:

初始化方法:名稱自定義
public void init(){
Log.debug("我是初始化");
}

銷燬方法:名稱自定義
public void destory(){
Log.debug("我是銷燬");
}

輸出結果如下所示: 會發現 初始化 會最先被呼叫 ,接下來是相應方法 ,最後在關閉容器的時候 物件銷燬,所以會呼叫 相關的銷燬方法。

6217104-df8a3e6d06d12cae.png
image.png

Scope範圍:預設就是單例模式,這種方式也是最好的。

6217104-9898d759fb6c89b8.png
image.png

列印的地址是一樣的。

這個時候 我們修改 Scope的屬性值 ,把屬性值修改成為 prototype


6217104-a6d19c1eebdf8577.png
image.png

這時候觀察結果 ,兩次列印的地址值是不同的 ,這也就是說明了 此方法生成的物件別不是單例的。
並且在自己觀察發現 ,當我們關閉容器的時候,發現並沒有呼叫相應的銷燬方法 所以這也就說明了一個問題,

這種方式需要手動呼叫銷燬方法:

6217104-fd7b6d282676a840.png
image.png

當我們新增這兩行程式碼之後 觀察列印輸出 :
6217104-3c18fec12bd999d7.png
image.png

相關文章