第四天:spring架構 spring的IOC
Spring javaEE靈魂架構
1. IOC(控制反轉)
2. IOC注解開發
3. AOP(面向切面程式設計)(難點)
4. Spring的事物管理
#Spring 概述
##1.1 spring 概述
###1.1.1 spring 是什麼
Spring是分層的 Java SE/EE應用 一站式 輕量級開源架構,以 IoC(Inverse Of Control:
反轉控制)和 AOP(Aspect Oriented Programming:面向切面程式設計)為核心,提供了展現層 Spring
MVC 和持久層 Spring JDBC 以及業務層事務管理等衆多的企業級應用技術,還能整合開源世界衆多
著名的第三方架構和類庫,逐漸成為使用最多的Java EE 企業應用開源架構。
spring的兩大核心
IOC
AOP
###1.1.2 Spring 的發展曆程
EJB sun公司的javaEE規範
1997 年 IBM提出了EJB 的思想
1998 年,SUN制定開發标準規範 EJB1.0
1999 年,EJB1.1 釋出
2001 年,EJB2.0 釋出
2003 年,EJB2.1 釋出
2006 年,EJB3.0 釋出
***Rod Johnson ( spring 之父)
Expert One-to-One J2EE Design and Development(2002)
闡述了 J2EE 使用EJB 開發設計的優點及解決方案
Expert One-to-One J2EE Development without EJB(2004)
闡述了 J2EE 開發不使用 EJB的解決方式(Spring 雛形)
2017 年9月份釋出了spring 的最新版本 0 spring 5.0 通用版( GA )
###1.1.3 spring 的優勢
1. 友善解耦,簡化開發
通過 Spring提供的 IoC容器,可以将對象間的依賴關系交由 Spring進行控制,避免寫死所造
成的過度程式耦合。使用者也不必再為單例模式類、屬性檔案解析等這些很底層的需求編寫代碼,可
以更專注于上層的應用。
2. AOP 程式設計的支援(動态代理)
通過 Spring的 AOP 功能,友善進行面向切面的程式設計,許多不容易用傳統OOP 實作的功能可以
通過 AOP 輕松應付。
3. 聲明式事務的支援
可以将我們從單調煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活的進行事務的管理,
提高開發效率和品質。
4. 友善程式的測試
可以用非容器依賴的程式設計方式進行幾乎所有的測試工作,測試不再是昂貴的操作,而是随手可
做的事情。
5. 友善內建各種優秀架構
Spring可以降低各種架構的使用難度,提供了對各種優秀架構(Struts、Hibernate、Hessian、Quartz
等)的直接支援。
6. 降低 JavaEE API 的使用難度
Spring對 JavaEE API(如 JDBC、JavaMail、遠端調用等)進行了薄薄的封裝層,使這些 API 的
使用難度大為降低。
7. spring 源碼是經典學習範例
Spring的源代碼設計精妙、結構清晰、匠心獨用,處處展現着大師對Java 設計模式靈活運用以
及對 Java技術的高深造詣。它的源代碼無意是 Java 技術的最佳實踐的範例。
###1.1.4 spring 的 體系結構

#第2 章 IoC 的概念和作用
##2.1 程式的耦合和解耦
耦合(Coupling),也叫耦合度,是對子產品間關聯程度的度量。耦合的強弱取決于子產品間接口的複雜性、調
用子產品的方式以及通過界面傳送資料的多少。子產品間的耦合度是指子產品之間的依賴關系,包括控制關系、調用關
系、資料傳遞關系。子產品間聯系越多,其耦合性越強,同時表明其獨立性越差( 降低耦合性,可以提高其獨立
性)。耦合性存在于各個領域,而非軟體設計中獨有的,但是我們隻讨論軟體工程中的耦合。
在軟體工程中,耦合指的就是就是對象之間的依賴性。對象之間的耦合越高,維護成本越高。是以對象的設計應使類和構件之間的耦合最小。
軟體設計中通常用耦合度和内聚度作為衡量子產品獨立程度的标準。
劃分子產品的一個準 則就是高内聚低耦合。
#第3 章 spring 的 IOC
AOP:是一種程式設計思想,和oop一樣,可以說是oop的一種延伸。在傳統程式設計寫代碼的時候,如果我們在在多個類中調用(當我們需要為分散的對象引入公共行為的時候)同一個方法(功能)的時候,可以能回導緻重複的代碼太多了,方法與方法(業務邏輯)之間存在嚴重耦合(例如日志功能。日志代碼往往水準地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系。在OOP設計中,它導緻了大量代碼的重複,而不利于各個子產品的重用。)這個時候我們要把這個方法(功能)封裝成一個封面,然後注入要所需要這個功能的類中。(利用spring的ioc的rel屬性)将程式中的交叉業務邏輯(比如安全,日志,事務等),封裝成一個切面,然後注入到目标對象(具體業務邏輯)中去。
實作AOP的技術,主要分為兩大類:一是采用動态代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行為的執行;二是采用靜态織入的方式,引入特定的文法建立“方面”,進而使得編譯器可以在編譯期間織入有關“方面”的代碼.
簡單點解釋,比方說你想在你的biz層所有類中都加上一個列印‘你好’的功能,這時就可以用aop思想來做.你先寫個類寫個類方法,方法經實作列印‘你好’,然後Ioc這個類 ref=“biz.*”讓每個類都注入即可實作。
IOC控制反轉:控制對象的建立,反轉是以前是我們自己手動new建立對象,現在把建立的權利交給spring容器(IOC容器)。
将原來本來應該由程式建立對象交給spring容器去建立
将程式建立對象權利反轉給spring,幫你管理所有對象
##3.1 下載下傳Spring
官網:http://spring.io/
下載下傳位址:
http://repo.springsource.org/libs-release-local/org/springframework/spring
特别說明:
spring5 版本是用 jdk8 編寫的,是以要求我們的 jdk 版本是 8 及以上。
##3.2基于XMl配置IOC (
##3.3 Spring 基于 XML 的 的 IOC 細節
### 3.3.1 BeanFactory 和 和 ApplicationContext 的差別
BeanFactory 才是 Spring 容器中的頂層接口。
ApplicationContext 是它的子接口。
BeanFactory 和 ApplicationContext 的差別:
建立對象的時間點不一樣。
ApplicationContext:隻要一讀取配置檔案,預設情況下就會建立對象。
BeanFactory:什麼使用什麼時候建立對象。
### 3.3.2 ApplicationContext 接口 的實作類
ClassPathXmlApplicationContext :
它是從類的根路徑下加載配置檔案 推薦使用這種
FileSystemXmlApplicationContext :
它是從磁盤路徑上加載配置檔案,配置檔案可以在磁盤的任意位置。
AnnotationConfigApplicationContext:
當我們使用注解配置容器對象時,需要使用此類來建立 spring 容器。它用來讀取注解。
### 3.3.3 bean标簽的屬性
屬性:
id:給對象在容器中提供一個唯一辨別。用于擷取對象。
class:指定類的全限定類名。用于反射建立對象。預設情況下調用無參構造函數。
scope:指定對象的作用範圍。
* singleton :預設值,單例的.
* prototype :多例的.
* request :WEB 項目中,Spring 建立一個 Bean 的對象,将對象存入到 request 域中.
* session :WEB 項目中,Spring 建立一個 Bean 的對象,将對象存入到 session 域中.
* global session :WEB 項目中,應用在 Portlet 環境.如果沒有 Portlet 環境那麼globalSession 相當于 session.
init-method:指定類中的初始化方法名稱。
destroy-method:指定類中銷毀方法名稱。
### 3.3.4 執行個體化 Bean 的三種方式
無參數構造的方式
靜态工廠的方式
執行個體工廠的方式
今日學習感受:堅持你熱愛的東西。最後一句話:三分天注定,七分靠打拼,一切都是最好的安排!