Spring實戰 (第4版),記錄一下!!

通過一週的時間,把這本書大概看了一下,在博客寫一下自己的理解!

分爲四部分

1、Spring框架的核心知識,DI(依賴注入)和AOP(面向切面編程)

2、Spring搭建web應用程序

3、告別前端,後端使用Spring

4、Spring與其他應用和服務進行集成

{1}、首先說一下第一部分吧!

1、Spring如何簡化開發 ?

  • POJO的輕量級
  • DI和接口方向松耦合
  • xml 或java類進行聲明式編程
  • 使用方面和模板消除樣板代碼

2、Spring具有多種應用程序上下文

爲什麼會有應用程序上下文?
有了應用程序上下文,可以通過調用上下文的getbean()從Spring容器中檢索bean

常用:ClassPathXmlApplication(xml配置文件中獲取)、AnnotationConfigWebApplicationContext(java配置類)

1、AnnotationConfigApplicationContext —從一個或多個基於Java的配置類
es中加載Spring應用程序上下文

ApplicationContext context = 
      new AnnotationConfigApplicationContext(com.springinaction.knights.config.KnightConfig.class);

2、ClassPathXmlApplicationContext -從位於類路徑中的一個或多個XML文件中加載上下文定義,將上下文定義文件視爲類路徑資源

ApplicationContext context = 
      new ClassPathXmlApplicationContext("knight.xml");

3、AnnotationConfigWebApplicationContext — 從一個或多個基於Java的配置類中加載Spring Web應用程序上下文
4、FileSystemXmlApplicationContext -從文件系統中的一個或多個XML文件加載上下文定義
5、XmlWebApplicationContext -從Web應用程序中包含的一個或多個XML文件加載上下文定義

3、Spring 提供兩種依賴注入

xml配置

<?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 id="knight" class="com.springinaction.knights.BraveKnight">
    <constructor-arg ref="quest" />	
  </bean>
  
  <bean id="quest" class="com.springinaction.knights.SlayDragonQuest">	
    <constructor-arg value="#{T(System).out}" />
  </bean>
  
</beans>

java配置

package com.springinaction.knights.config;

@Configuration
public class KnightConfig {

  @Bean
  public Knight knight() {
    return new BraveKnight(quest());
  }

  @Bean
  public Quest quest() {
    return new SlayDragonQuest(System.out);
  }

}

4、Spring AOP,將服務模塊化,提供聲明性事務和安全

AspectJ 切入點表達式

<?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"
  xsi:schemaLocation="http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
    http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd">

  <aop:config>
    <aop:aspect ref="minstrel">
      <aop:pointcut id="embark"
          expression="execution(* *.embarkOnQuest(..))"/>	
      
      <aop:before pointcut-ref="embark"	
          method="singBeforeQuest"/>

      <aop:after pointcut-ref="embark"	
          method="singAfterQuest"/>
    </aop:aspect>
  </aop:config>

</beans>

5、bean 生命週期

容器是Spring框架的核心,容器使用DI管理組成應用程序的組件
–>
傳統java應用中,bean的生命週期很簡單。使用java關鍵字new進行bean實例化,bean可以使用。bean不再被使用,由java進行垃圾回收。 – >
Spring的生命週期相對複雜。
在這裏插入圖片描述

BeanFactory工廠
在這裏插入圖片描述
Bean 工廠準備使用bean之前
1、Spring對bean進行實例化

   ClassPathXmlApplicationContext("knight.xml")

2、Spring將值和bean的引用注入到bean對應的屬性中

   java配置類bean、xml配置bean

3、如果bean實現了BeanNameAware接口,Spring將bean的ID傳遞給setBeam-Name()方法
在這裏插入圖片描述
4、如果bean實現了BeanFactoryAware接口,Spring調用setBeanFactory()方法,將BeanFactory容器實例注入
在這裏插入圖片描述
5、如果bean實現了BeanFactoryAware接口,Spring調用setApplicationContext()方法,將Bean所在的應用的上下文引入進來
在這裏插入圖片描述
6、如果bean實現了BeanPostProcessor接口,Spring調用postProcessBeforeInitialization()方法
7、如果bean實現了BeanPostProcessor接口,Spring調用postProcessAfterInitialization()方法
在這裏插入圖片描述
8、如果bean實現了InitializingBean接口,Spring調用afterPropertiesSet()方法。如果bean使用init-method 聲明初始化方法,該方法也會調用
在這裏插入圖片描述
9、此時bean準備就緒,可以被應用程序使用,一直駐留在上下文中,直到上下文被銷燬

10、bean實現了DisposableBean接口,Spring調用它的destory()接口方法,如果bean使用了
在這裏插入圖片描述
以上就可以瞭解如何創建和加載一個Spring容器。但是一個空的容器沒有太大價值,爲了DI(依賴注入)中受益,必須將應用對象裝配進Spring容器

小結

Spring關注於DI、AOP和消除樣板式代碼來簡化java開發;Spring還擴展了不同領域,例如Web服務、REST、移動開發以及NOSQL。

6、下載Spring發佈版本查看lib目錄時,多個jar文件,Spring4.0,發佈版本包括20多個不同模塊,每個模塊三個jar文件(二進制庫、源碼jar文件以及javaDOC的jar文件),完整的庫JAR文件

在這裏插入圖片描述

這些模塊依據功能劃分爲6類不同功能,可以自由選擇適合自身應用需求的Spring模塊,Spring不能滿足需求時,可以考慮其他選擇。Spring提供與第三方框架和類庫的集成點

在這裏插入圖片描述
在這裏插入圖片描述
Spring核心容器(beans、Core、Content、Expression、Context Support)

Spring框架最核心的部分,管理bean創建、配置和管理。模塊包括Spring bean工廠,爲Spring提供DI的功能。基於bean工廠,還會發現多種Spring應用上下文的實現,每一種提供了配置Spring的不同方式。
除了bean工廠和應用上下文,模塊也提供了許多企業服務,例如Email、JNDI訪問、EJB集成和調度。
所有的Spring模塊建立於核心容器之上。配置應用時,其實隱式的使用了這些類。

Spring的AOP模塊(AOP、Aspects)*

AOP模塊中,Spring對面向切面編程提供豐富支持。Spring應用系統中開發切面的基礎。DI一樣,AOP幫助應用對象解耦。藉助AOP ,將遍佈系統的關注點(例如事務和安全)從應用對象解耦出來。

數據訪問和集成(JDBC、Transaction、ORM、OXM、Messaging、JMS)

使用JDBC編寫代碼通常大量樣板式代碼,例如獲得數據庫連接、創建語句、處理結果集到關閉數據庫連接。Spring的JDBC和DAO(Data Access Oject)模塊抽象了這些樣板代碼,使數據庫代碼變得簡單明瞭,還可以避免數據庫資源連接失敗引發的問題。
對於喜歡ORM工具而不願意直接JDBC的開發者。提供ORM框架,建立在DAO支持之上,併爲多個框架提供一種構建DAO的簡便方式,Spring沒有嘗試創建ORM解決方案,而是對流行ORM框架進行集成,包括Hibemate、MyBatis、JPA(Java Persistemce API)。Spring事務管理支持所有的ORM框架以及JDBC。

Web與遠程調用(Web、Web Servlet、WebSocket)

MVC(Model - View - Controller)是一種普遍被接受的構建Web應用的方法,幫助用戶將界面邏輯與應用邏輯分離。例如Spring MVC、Struts。
除了面向用戶的,該模塊還提供了多種構建與其他應用交互的遠程調用方案。Spring遠程調用功能集成了RMI、Hession等,同時自帶遠程調用框架:HTTP invoker。Spring提供了暴露和使用REST API 的良好支持。

Instrumentation(Instrument、Instrument TomCat)

Spring的Instrmentation提供了爲JVM添加代理(agent)的功能。爲TomCat提供了一個織入代理,爲TomCat傳遞類文件,就像這些文件被類加載器加載的一樣。本書(Spring 4.0)不介紹!

測試(Test)

Spring提供了測試模塊致力於Sring應用的測試。

7、Spring Portfolio(Spring 系列)

Spring Portfolio包括多個構建於核心Spring框架之上的框架和類庫。概括地講,整個Spring Portfolio幾乎爲每一個領域的Java開發都提供了Spring編程模型。

Spring Web Flow

Spring Web Flow建立於Spring MVC框架之上,它爲基於流程的會話式Web應用(可以想一下購物車或者嚮導功能)提供了支持。 Spring Web Flow的主頁(http://projects.spring.io/spring-webflow/)。

Spring Web Service

雖然核心的Spring框架提供了將Spring bean以聲明的方式發佈爲Web
Service的功能,但是這些服務是基於一個具有爭議性的架構(拙劣的契 約後置模型)之上而構建的。這些服務的契約由bean的接口來決定。
Spring Web Service提供了契約優先的Web Service模型,服務的實現都 是爲了滿足服務的契約而編寫的。
http://docs.spring.io/spring- ws/site/

Spring Security

安全對於許多應用都是一個非常關鍵的切面。利用Spring AOP,Spring
Security爲Spring應用提供了聲明式的安全機制。
http://projects.spring.io/spring-security/

Spring Integration

許多企業級應用都需要與其他應用進行交互。Spring Integration提供了多種通用應用集成模式的Spring聲明式風格實現。
主頁:http://projects.spring.io/spring-integration/

Spring Batch

當我們需要對數據進行大量操作時,沒有任何技術可以比批處理更勝任這種場景。如果需要開發一個批處理應用,你可以通過Spring Batch,
使用Spring強大的面向POJO的編程模型。 http://projects.spring.io/ spring-batch/

Spring Data

Spring
Data使得在Spring中使用任何數據庫都變得非常容易。儘管關係型數據庫統治企業級應用多年,但是現代化的應用正在認識到並不是所
有的數據都適合放在一張表中的行和列中。 一種新的數據庫種類,通常被稱之爲NoSQL數據庫[2],提供了使用數據的新方法,這些方法會比傳
統的關係型數據庫更爲合適。 Spring Data都爲持久化提供了一種簡單的編程模型。
這包括爲多種數據庫類型提供了一種自動化的Repository機制,它負責爲你創建Repository的實現。

Spring Social

移動應用是另一個引人矚目的軟件開發領域。智能手機和平板設備已成爲許多用戶首選的客戶端。Spring Mobile是Spring
MVC新的擴展模 塊,用於支持移動Web應用開發。 Spring Social並不僅僅是tweet和好友。儘管名字是這樣,但Spring
Social更多的是關注連接(connect),而不是社交(social)。它能 夠幫助你通過REST
API連接Spring應用,其中有些Spring應用可能原本並沒有任何社交方面的功能目標。
https://spring.io/guides/gs/accessing-
facebook/和https://spring.io/guides/gs/accessing-twitter/

Spring Boot

Spring極大地簡化了衆多的編程任務,減少甚至消除了很多樣板式代碼,如果沒有Spring的話,在日常工作中你不得不編寫這樣的樣板代碼。
Spring Boot是一個嶄新的令人興奮的項目,它以Spring的視角,致力於簡化Spring本身。 Spring
Boot大量依賴於自動配置技術,它能夠消除大部分(在很多場景中,甚至是全部)Spring配置。它還提供了多個Starter項目,不管你使
用Maven還是Gradle,這都能減少Spring工程構建文件的大小。

8、Spring特性

Spring 3:

  • 解決各種環境下不同配置的問題,環境profile功能;
  • 提供了@RequestMappingproduces和consumes屬性,用於匹配請求中的Accept和Content-Type頭部信息;
  • @ControllerAdvice註解能夠將通用的@ExceptionHandler、@InitBinder和@ModelAttributes方法收集到一個類中,並 應用到所有控制器上;
  • 基礎的抽象類AbstractDispatcherServletInitializer能夠非常便利地配置DispatcherServlet,而不必再使用web.xml。
    與之類似,當你希望通過基於Java的方式來配置Spring的時候,可以使用Abstract- AnnotaionConfigDispatcherServletInitializer的子類;
  • 在攔截器匹配時,支持使用URL模式將其排除在攔截器的處理功能之外。

Spring 4:

  • Spring提供了對WebSocket編程的支持,包括支持JSR-356——Java API for WebSocket;

  • 鑑於WebSocket僅僅提供了一種低層次的API,急需高層次的抽象,因此Spring
    4.0在WebSocket之上提供了一個高層次的面向消息的編 程模型,該模型基於SockJS,並且包含了對STOMP協議的支持;

  • Spring是第一批(如果不說是第一個的話)支持Java 8特性的Java框架,比如它所支持的lambda表達式。

  • 與Java 8同時得到支持的是JSR-310——Date與Time API,在處理日期和時間時,它爲開發者提供了
    比java.util.Date或java.util.Calendar更豐富的API;

第一部分小結:

對Spring有了一個清晰的認識。Spring致力於簡化企業級java開發,促進代碼鬆散耦合。成功關鍵在於依賴注入和AOP 。

DI是組裝應用對象的一種方式,藉助這種方式對象無需知道依賴來自何處或者依賴實現方式,不同於自己獲取依賴對象,對象運行期賦予他們所依賴的對象,依賴對象通過接口瞭解注入的對象,確保低耦合。

除了DI,我們還簡單介紹了Spring對AOP的支持。AOP可以幫助應用將散落在各處的邏輯彙集於一處——切面。當Spring裝配bean的時候,這些切面能夠在運行期編織起來,這樣就能非常有效地賦予bean新的行爲。

依賴注入和AOP是Spring框架最核心的部分,因此只有理解了如何應用Spring最關鍵的功能,你纔有能力使用Spring框架的其他功能。在本
章,我們只是觸及了Spring DI和AOP特性的皮毛。

第2章 裝配bean

2.1 Spring配置的可選方案

Spring裝配bean有非常大的靈活性,提供三種主要的裝配機制:

  • XML中進行顯式配置
  • Java中進行顯式配置
  • 隱式的bean的發現機制和自動裝配

Spring容器負責創建應用程序中的bean並通過DI來協調對象之間的關係,作爲開發人員,需要告訴
Spring創建哪些bean並且如何裝配在一起。

Spring的配置風格是可以互相搭配的,所以你可以選擇使用XML裝配一些bean,使用Spring基於Java的配置(JavaConfig)來裝配另一些bean,而將剩餘的 bean讓Spring去自動發現。

我建議是儘可能地使用自動配置的機制。顯式配置越少越好。當你必須要顯式配置bean的時候(比如,有些源碼不是由你來維護 的,而當你需要爲這些代碼配置bean的時候)

我推薦使用類型安全並且比XML更加強大的JavaConfig。最後,只有當你想要使用便利的XML 命名空間,並且在JavaConfig中沒有同樣的實現時,才應該使用XML。

2.2 自動化配置bean
2.2.1、創建可被發現的bean
Spring兩個角度實現自動化裝配:

  • 組件掃描(component scanning):Spring會自動發現應用上下文中所創建的bean。
  • 自動裝配(autowiring):Spring自動滿足bean之間的依賴。

@ComponentScan註解啓用了組件掃描,也可以使用Spring context命名空間context:component-scan元素

1、帶有@Component註解的實現類
@ComponentScan註解啓用了組件掃描

2、通過XML啓用組件掃描
Spring context命名空間context:component-scan元素

Spring測試:
類上邊固定兩個註解,第二個要替換成自己寫好的配置文件
使用了Spring的SpringJUnit4ClassRunner,以便在測試開始的時候自動創建Spring的應用上下文。
@ContextConfiguration會告訴它需要在配置文件中加載配置。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({“classpath:spring/spring-dao.xml”, “classpath:spring/spring-service.xml”})

在這裏插入圖片描述
2.2.2、爲組件掃描的bean命名
Spring應用上下文中所有的bean都會給定一個ID。
@Component註解。如果只標明@Component註解,將類名的第一個字母變爲小寫就是ID。
1、 如果想爲這個bean設置不同的ID,你所要做的就是將期望的ID作爲值傳遞給@Component註解。比如說,如果想將這個bean標識 爲lonelyHeartsClub,那麼你需要將SgtPeppers類的@Component註解配置爲如下所示:
在這裏插入圖片描述
2、還有另外一種爲bean命名的方式,這種方式不使用@Component註解,而是使用Java依賴注入規範(Java Dependency Injection)中所提供 的@Named註解來爲bean設置ID:
在這裏插入圖片描述
我更加強烈地喜歡@Component註解

2.2.3 爲bean添加註解實現自動裝配
自動裝配就是讓Spring自動滿足bean依賴的一種方法,爲了聲明要進行自動裝配,我們可以藉助Spring的@Autowired註解。
在這裏插入圖片描述
把required屬性設置爲false時,你需要謹慎對待。如果在你的代碼中沒有進行null檢查的話,這個處於未裝配狀態的屬性有可能會 出現NullPointerException。
在這裏插入圖片描述
2.3 通過Java代碼裝配bean
JavaConfig是配置代碼。這意味着它不應該包含任何業務邏輯,JavaConfig也不應該侵入到業務邏輯代碼之中。通常會將JavaConfig放到單獨的包中,使它與其他的應用程序邏輯分離開來。
2.3.1、創建配置類
創建JavaConfig類的關鍵在於爲其添加@Configuration註解,@Configuration註解表明這個類是一個配置類,該類應該包含在Spring應 用上下文中如何創建bean的細節。
2.3.2 聲明簡單的bean
方法添加@Bean註解。@Bean註解會告訴Spring這個方法將會返回一個對象,該對象要註冊爲Spring應用上下文中的bean。方法體中包含了最終產生bean實例的邏 輯。

2.3.3 藉助JavaConfig實現注入
在JavaConfig中裝配bean的最簡單方式就是引用創建bean的方法。

2.4 通過XML裝配bean
2.4.1 創建XML配置規範
用來裝配bean的最基本的XML元素包含在spring-beans模式之中,在上面這個XML文件中,它被定義爲根命名空間。是該模式中 的一個元素,它是所有Spring配置文件的根元素。
在這裏插入圖片描述
2.4.2 聲明一個簡單的
id:名稱 class:引用的類
在這裏插入圖片描述
2.4.3 藉助構造器注入初始化bean
構造器注入bean引用
在這裏插入圖片描述
2.4.4 設置屬性
略…

第二部分小結:

Spring框架的核心是Spring容器。容器負責管理應用中組件的生命週期,它會創建這些組件並保證它們的依賴能夠得到滿足,這樣的話,組件才能完成預定的任務。
在Spring中裝配bean的三種主要方式:自動化配置、基於Java的顯式配置以及基於XML的顯式配置。
我同時建議儘可能使用自動化配置,以避免顯式配置所帶來的維護成本。但是,如果你確實需要顯式配置Spring的話,應該優先選擇基於Java
的配置,它比基於XML的配置更加強大、類型安全並且易於重構。

第3章 高級裝配
3.1、環境與profile
在這裏插入圖片描述
3.1.1 配置profile bean
可以寫一個配置類,一個配置類可以寫多個bean,多個環境prod(生產環境)、dev()

在這裏插入圖片描述
在這裏插入圖片描述
3.4 bean的作用域
默認情況下,Spring應用上下文中所有bean都是作爲以單例(singleton)的形式創建的。也就是說,不管給定的一個bean被注入到其他bean 多少次,每次所注入的都是同一個實例。

在這裏插入圖片描述
第4章 面向切面的Spring

在這裏插入圖片描述
在這裏插入圖片描述
通知(Advice)

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
第二部分 Web中的Spring
Spring MVC基於模型-視圖-控制器(Model-View-Controller,MVC)模式實現
5.1 Spring MVC起步

在這裏插入圖片描述

1、配置DispatcherServlet
DispatcherServlet是Spring MVC的核心。在這裏請求會第一次接觸到框架,它要負責將請求路由到其他的組件之中。
當DispatcherServlet啓動的時候,它會創建Spring應用上下文,並加載配置文件或配置類中所聲明的bean。

在這裏插入圖片描述
在這裏插入圖片描述
啓用Spring MVC
mvc:annotation-driven啓用註解驅動的Spring MVC。
在這裏插入圖片描述
在這裏插入圖片描述

使用Thymelea

Thymeleaf 的詳細使用:
略…
第7章 Spring MVC的高級技術
7.1 Spring MVC配置的替代方案
7.1.1 自定義DispatcherServlet配置

第9章 保護Web應用
9.1 Spring Security簡介
Spring Security提供了完整的安全性解決方案,它能夠在Web請 求級別和方法調用級別處理身份認證和授權。因爲基於Spring框架,所以Spring Security充分利用了依賴注入(dependency injection,DI)和 面向切面的技術。
在這裏插入圖片描述

9.1.2 過濾Web請求
9.1.3 編寫簡單的安全性配置
啓用Web安全性功能最簡配置
9.2 選擇查詢用戶詳細信息的服務
9.2.1 使用基於內存的用戶存儲
9.3 攔截請求
9.4 認證用戶
9.5 保護視圖

第3部分 後端中的Spring

第10章 通過Spring和JDBC征服數據庫
第11章 使用對象-關係映射持久化數據
第12章 使用NoSQL數據庫
12.1 使用MongoDB持久化文檔數據
12.2 使用Neo4j操作圖數據
12.3 使用Redis操作key-value數據
Redis是一種特殊類型的數據庫,它被稱之爲key-value存儲。顧名思義,key-value存儲保存的是鍵值對。實際上,key-value存儲與哈希Map有 很大的相似性。可以不太誇張地說,它們就是持久化的哈希Map。
12.3.1 連接到Redis
1、創建連接工廠配置 JedisConnectionFactory
在這裏插入圖片描述

連接方式:

12.3.2 使用RedisTemplate
Spring Data Redis以模板的形式提供了較高等級的數據訪問方案。實際上,Spring Data Redis提供了兩個模 板:

  • RedisTemplate
  • StringRedisTemplate

使用List類型的值
在Set上執行操作
在這裏插入圖片描述
第13章 緩存數據
13.1 啓用對緩存的支持
Spring對緩存的支持有兩種方式:
註解驅動的緩存
XML聲明的緩存

使用Spring的緩存抽象時,最爲通用的方式就是在方法上添加@Cacheable和@CacheEvict註解。

1、通過使用@EnableCaching啓用註解驅動的緩存
XML方式配置,可以使用Spring cache命名空間中的cache:annotation-driven元素來啓用註解驅動的緩存
在這裏插入圖片描述
2、通過使用啓用註解驅動的緩存

 其實在本質上,@EnableCaching和<cache:annotation-driven>的工作方式是相同的。它們都會創建一個切面(aspect)並觸發 Spring緩存註解的切點(pointcut)。根據所使用的註解以及緩存的狀態,這個切面會從緩存中獲取數據,將數據添加到緩存之中或者從緩存中 移除某個值。
 緩存管理器是Spring緩存抽象的核心,它能夠與多個流行的緩存實現進行集成。

13.1.1配置緩存管理器
Spring 3.1 內置五個緩存管理器
在這裏插入圖片描述
Spring Data提供了兩個緩存管理器
RedisCacheManager(來自於Spring Data Redis項目)
GemfireCacheManager(來自於Spring Data GemFire項目)

藉助Spring Boot簡化Spring開發

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