IOC與生命週期
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>
第二步:編寫持久層的介面和實現類
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();
}
觀察結果輸出如下 :
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("我是銷燬");
}
輸出結果如下所示: 會發現 初始化 會最先被呼叫 ,接下來是相應方法 ,最後在關閉容器的時候 物件銷燬,所以會呼叫 相關的銷燬方法。
Scope範圍:預設就是單例模式,這種方式也是最好的。
列印的地址是一樣的。
這個時候 我們修改 Scope的屬性值 ,把屬性值修改成為 prototype
這時候觀察結果 ,兩次列印的地址值是不同的 ,這也就是說明了 此方法生成的物件別不是單例的。
並且在自己觀察發現 ,當我們關閉容器的時候,發現並沒有呼叫相應的銷燬方法 所以這也就說明了一個問題,
這種方式需要手動呼叫銷燬方法:
當我們新增這兩行程式碼之後 觀察列印輸出 :
相關文章
- IOC - bean 生命週期Bean
- View生命週期與Activity生命週期的關係View
- 淺析spring——IOC 之 分析 Bean 的生命週期SpringBean
- Spring(十二):IOC容器中Bean的生命週期方法SpringBean
- Servlet生命週期與方法Servlet
- MVN命令與生命週期
- ASP.NET頁面生命週期與應用程式生命週期ASP.NET
- 生命週期
- Activity生命週期與啟動模式模式
- ubuntu生命週期Ubuntu
- vue生命週期Vue
- spring生命週期Spring
- Flutter - 生命週期Flutter
- sessionStorag 生命週期Session
- PHP 生命週期PHP
- maven生命週期Maven
- Activity生命週期
- React生命週期React
- vue - 生命週期Vue
- Fragment生命週期Fragment
- Salesforce 生命週期管理(一)應用生命週期淺談Salesforce
- Vue 生命週期與鉤子函式Vue函式
- Spring的生命週期Spring
- UIAbility元件生命週期UI元件
- bean的生命週期Bean
- Servlet的生命週期Servlet
- React 元件生命週期React元件
- Tomcat生命週期管理Tomcat
- Laravel框架生命週期Laravel框架
- SQL的生命週期SQL
- MySQL GTID生命週期MySql
- Spring Bean生命週期SpringBean
- maven-生命週期Maven
- UIViewController的生命週期UIViewController
- Flutter -- Element生命週期Flutter
- Flutter 的生命週期Flutter
- 類的生命週期
- Bean-生命週期Bean