深入理解 Spring 核心技術01 ---IOC容器概述

相信大家都知道Spring是一個輕量級的Java開發框架,近年來一直都是Java開發中最受歡迎的框架之一。今天就和大家來介紹一下spring框架。
提到spring就不得而不提到一個人,叫做Rod Johnson,這位技術大牛就是spring框架的創始人。在早些年,隨着技術的發展,企業級應用程序變得越來越複雜,爲了全面應對各種複雜的需求JavaEE開發的規範也越來越龐大,而其核心的EJB規範由於自身的一下缺陷受到了開發者大量的吐槽,這時各種民間的高手都在開發自己的框架,試圖取代EJB。而最成功的就是現在的spring。
說到這裏可能有的小夥伴有點好奇EJB是什麼鬼,這裏解釋一下,EJB就是企業級JavaBean,由sun公司提出的一套JavaEE企業級應用的解決方案,不過很可惜,它是屬於重量級的框架,因此受到很多開發者的詬病。好了,關於spring的起源先聊到這裏,下面我們來看看spring到底有什麼好處。
大家都知道傳統的JavaEE應用開發效率比較低,而且應用服務器廠商對各種技術的支持並沒有做到完全統一,從而導致JavaEE程序並沒有實現“write Once,Run Anywhere”的承諾,而這個時候spring出現了,作爲一箇中間件,他是獨立於各種應用服務器甚至不需要應用服務器的支持,也能提供應用服務器的功能。因此可以說spring就是爲了簡化開發而出現的。Rod Johnson也說過spring就是爲了解決企業級應用開發的複雜性而存在的。
說了這麼多現在進入正題,spring的好處就是簡化應用開發,那麼他是怎麼實現簡化開發的呢?
說到這裏就不得不提一下程序的耦合的概念,相信大家都知道軟件開發的過程中有一條很重要的原則,就是要降低程序代碼之間的耦合,那麼到底什麼是程序的耦合呢。
來看下面這段代碼:

	Class.forName("com.mysql.jdbc.Driver");
	Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/spring", "root", "1234");
	PreparedStatement pstm = conn.prepareStatement("select * from cst_customer");
	ResultSet rs = pstm.executeQuery();
	while(rs.next()){
		System.out.println(rs.getString("cust_name"));
	}
	rs.close();
	pstm.close();
	conn.close();

1
2
3
4
5
6
7
8
9
10

上述這段代碼就是通過原生的JDBC連接數據庫的一段代碼,這裏我們是以MySQL爲例的,加入在開發中我們更換了數據庫的品牌,那麼我們就必須要重新在寫這段代碼了。原因是這裏的一段代碼對mysql的驅動包產生了依賴,而這種依賴就可以理解成是一種程序的耦合。
同樣的,我們在開發中會寫到很多類,而有些類和類之間不可避免的產生了依賴關係,這種依賴關係就是耦合。程序之間的耦合從某種意義上來說是不可避免的,因爲一個項目運行必須要依賴於運行環境,對於運行期間我們是沒有辦法的,也不可能解除耦合。但是對於某些編譯期的耦合我們是可以通過代碼來進行解除的,
看下面的這段代碼:

public class Service {
//創建持久層對象
private Dao dao = new Dao();

 public Integer getDate() {
	 return dao.getDate();
 }

}

1
2
3
4
5
6
7
8
9

上述代碼中service中需要使用dao的功能,因此就需要創建dao的實例。這個時候我們就可以說Service類依賴於Dao類,你可以想象一下,假如在公司裏你是負責Service層的設計,另外一個人負責Dao層的設計,如果負責Dao層的人沒有完成任務,那麼你還能繼續正常的編寫 單元測試嗎,由此可見,程序之間的耦合是件很頭疼的事。爲了解決這個問題,Spring就登場了!
終於步入正題了,看下面這張圖:
這裏寫圖片描述
上圖中大家可以看到應用程序需要的對象資源是由工廠提供的,而不是通過new的方式,因此就可以避免造成層與層之間的耦合,解釋一下,工廠大家可以理解成負責幫我們從容器中獲取一個對象的類,於是這樣的話我們獲取對象的方式就發生了改變,
以前我們獲取對象需要自己new,但是現在有工廠爲我們提供對象,
這種方式獲取對象的思想就叫控制反轉,Inversion Of Control ,簡稱IOC
他是spring框架的和核心之一,這樣做的目的就是削減程序之間的耦合!
下面通過一個小案例來看看spring是怎麼解決耦合的問題吧
打開eclipse,創建一個javaProject目錄結構如下圖所示:
這裏寫圖片描述
如上圖所示,在類路徑下創建一個bean的xml文件,同時我們需要在lib路徑下把spring框架所需要的jar包導入到項目中。根據三層架構的規範創建包。創建好了如下圖所示:
這裏寫圖片描述
關於這些jar包的作用後面會逐步給大家講解,我們先來打開bean.xml文件,將下面的內容寫入其中:

<?xml version="1.0" encoding="UTF-8"?>

ns xmlns=“http://www.springframework.org/schema/beans”
xmlns:p=“http://www.springframework.org/schema/p”
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”>

  	<!-- 配置Servicce 和DAO -->				 
  	<bean id="customerDao" class="wcan.dao.impl.CustomerDaoImpl"/>    
  	<bean id="customerService" class="wcan.service.impl.CustomerServiceImpl"/>
1
2
3
4
5
6
7
8
9
10
11
12
13

完成這一步後,大家再按照下圖來創建類和接口:

這裏寫圖片描述
注意,只需要創建類和接口就可以了,不需要些其他的功能代碼,創建完成後,我們來打開web包下的Client類,在該類中添加如下代碼:

public class Client {
@Test
public void TestSpringDemo() {
//使用applicationContext接口
ApplicationContext ac = new ClassPathXmlApplicationContext(“bean.xml”);
//根據bean的id獲取對象
ICustomerService ics = (ICustomerService)ac.getBean(“customerService”);
System.out.println(ics);
ICustomerDao cd = (ICustomerDao) ac.getBean(“customerDao”);
System.out.println(cd);

}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14

這時當我們運行這個測試類的時候就會得到如下結果:
這裏寫圖片描述

可以發現我們沒用new關鍵字就可以獲取到service層和dao層的對象,這就是spring框架帶來的好處,那麼問題來了,spring是怎麼創建的對象呢?/
我們回到bean.xml文件中,仔細看這段代碼:

<!-- 配置Servicce 和DAO -->				 
  	<bean id="customerDao" class="wcan.dao.impl.CustomerDaoImpl"/>    
  	<bean id="customerService" class="wcan.service.impl.CustomerServiceImpl"/>

1
2
3

可以看到bean標籤有個id屬性和class屬性,id屬性的作用是給bean一個標識,class屬性用於指定具體的類名。
再來回到client類中,
這裏寫圖片描述
上述圖中通過ClassPathXmlApplicationContext從類路徑下加載一個bean.xml的配置文件,根據bean.xml文件中配置的id屬性和class屬性來創建對象,最後將對象的地址打印出來。
到這裏可能你還是一頭霧水,其實所謂控制反轉就是說,我們在使用spring框架的時候我們不需要自己去創建對象,創建對象這件事從我們這裏轉移到容器幫我們創建,因此我們只需要集中精力開發自己的業務功能模塊,而不需要處理複雜的對象和對象之間的關係
於是就可以很大程度上節省開發的時間,提高開發的效率。所以就有了spring框架能夠提高程序開發的效率之說。
好了,聊到了這裏相信大家對IOc有了一定的認識了把,下一篇小風給大家介紹Spring框架中的另外一個核心部分----Aop
————————————————
版權聲明:本文爲CSDN博主「Skr_coder」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_38701478/article/details/82086048

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章