第1章 Spring之旅
所有的理念都可以追溯到Spring最根本的使命上:簡(jiǎn)化Java開(kāi)發(fā)。
Spring的非侵入編程模型意味著這個(gè)類在Spring應(yīng)用和非Spring應(yīng)用中都可以發(fā)揮同樣的作用。
創(chuàng)建應(yīng)用組件之間協(xié)作的行為通常稱為裝配
基于XML的配置還是基于Java的配置
Spring通過(guò)應(yīng)用上下文(Application Context)裝載bean的定義并把它們組裝起來(lái)贷腕。
Spring容器使用DI管理構(gòu)成應(yīng)用的組件彻舰,它會(huì)創(chuàng)建相互協(xié)作的組件之間的關(guān)聯(lián)并巍。
應(yīng)用上下文:
AnnotationConfigApplicationContext:從一個(gè)或多個(gè)
基于Java的配置類中加載Spring應(yīng)用上下文。
AnnotationConfigWebApplicationContext:從一個(gè)或
多個(gè)基于Java的配置類中加載Spring Web應(yīng)用上下文束莫。
ClassPathXmlApplicationContext:從類路徑下的一個(gè)或
多個(gè)XML配置文件中加載上下文定義髓废,把應(yīng)用上下文的定義文件
作為類資源巷懈。
FileSystemXmlapplicationcontext:從文件系統(tǒng)下的一
個(gè)或多個(gè)XML配置文件中加載上下文定義。
XmlWebApplicationContext:從Web應(yīng)用下的一個(gè)或多個(gè)
XML配置文件中加載上下文定義慌洪。
第2章 裝配Bean
Spring具有非常大的靈活性,它提供了三種主要的裝配機(jī)制:
在XML中進(jìn)行顯式配置凑保。
在Java中進(jìn)行顯式配置冈爹。
隱式的bean發(fā)現(xiàn)機(jī)制和自動(dòng)裝配。
以上幾個(gè)方法欧引,可以混合使用频伤。
1. 自動(dòng)化裝配bean
Spring從兩個(gè)角度來(lái)實(shí)現(xiàn)自動(dòng)化裝配:
組件掃描(component scanning):Spring會(huì)自動(dòng)發(fā)現(xiàn)應(yīng)用上下文
中所創(chuàng)建的bean。
自動(dòng)裝配(autowiring):Spring自動(dòng)滿足bean之間的依賴芝此。
@Component注解:這個(gè)簡(jiǎn)單的注解表明該類會(huì)作為組件類憋肖,并告知Spring要為這個(gè)類創(chuàng)建bean
@ComponentScan注解:?jiǎn)⒂昧私M件掃描
Spring應(yīng)用上下文中所有的bean都會(huì)給定一個(gè)ID。在前面的例子中婚苹,
盡管我們沒(méi)有明確地為SgtPeppersbean設(shè)置ID岸更,但Spring會(huì)根據(jù)類
名為其指定一個(gè)ID。具體來(lái)講膊升,這個(gè)bean所給定的ID
為sgtPeppers怎炊,也就是將類名的第一個(gè)字母變?yōu)樾憽?/p>
@Configuration注解表明這個(gè)類是一個(gè)配置類,該類應(yīng)該包含在Spring應(yīng)用上下文中如何創(chuàng)建bean的細(xì)節(jié)。
@Bean注解會(huì)告訴Spring這個(gè)方法將會(huì)返回一個(gè)對(duì)象评肆,該對(duì)象要注冊(cè)為Spring應(yīng)用上下文中的bean债查。
Spring定義了多種作用域,可以基于這些作用域創(chuàng)建bean瓜挽,包括:
單例(Singleton):在整個(gè)應(yīng)用中盹廷,只創(chuàng)建bean的一個(gè)實(shí)例。
原型(Prototype):每次注入或者通過(guò)Spring應(yīng)用上下文獲取的
時(shí)候久橙,都會(huì)創(chuàng)建一個(gè)新的bean實(shí)例速和。
會(huì)話(Session):在Web應(yīng)用中,為每個(gè)會(huì)話創(chuàng)建一個(gè)bean實(shí)
例剥汤。
請(qǐng)求(Rquest):在Web應(yīng)用中颠放,為每個(gè)請(qǐng)求創(chuàng)建一個(gè)bean實(shí)
例。
第4章 面向切面的Spring
AOP已經(jīng)形成了自己的術(shù)語(yǔ)吭敢。描述切面的常用術(shù)
語(yǔ)有通知(advice)碰凶、切點(diǎn)(pointcut)和連接點(diǎn)(join point)。
通知:切面也有目標(biāo)——它必須要完成的工作鹿驼。在AOP術(shù)語(yǔ)中欲低,切面的工作被稱為通知。
Spring切面可以應(yīng)用5種類型的通知:
前置通知(Before):在目標(biāo)方法被調(diào)用之前調(diào)用通知功能畜晰;
后置通知(After):在目標(biāo)方法完成之后調(diào)用通知砾莱,此時(shí)不會(huì)關(guān)
心方法的輸出是什么;
返回通知(After-returning):在目標(biāo)方法成功執(zhí)行之后調(diào)用通
知凄鼻;
異常通知(After-throwing):在目標(biāo)方法拋出異常后調(diào)用通知腊瑟;
環(huán)繞通知(Around):通知包裹了被通知的方法,在被通知的方
法調(diào)用之前和調(diào)用之后執(zhí)行自定義的行為块蚌。
連接點(diǎn):連接點(diǎn)是在應(yīng)用執(zhí)行過(guò)程中能夠插入切面的一個(gè)點(diǎn)闰非。
切點(diǎn):切點(diǎn)的定義會(huì)匹配通知所要織入的一個(gè)或多個(gè)連接點(diǎn)。
切面:切面是通知和切點(diǎn)的結(jié)合峭范。通知和切點(diǎn)共同定義了切面的全部?jī)?nèi)容财松。
引入:引入允許我們向現(xiàn)有的類添加新方法或?qū)傩浴?/p>
織入:織入是把切面應(yīng)用到目標(biāo)對(duì)象并創(chuàng)建新的代理對(duì)象的過(guò)程。
在目標(biāo)對(duì)象的生命周期里有多個(gè)點(diǎn)可以進(jìn)行織入:
編譯期:切面在目標(biāo)類編譯時(shí)被織入纱控。這種方式需要特殊的編譯
器辆毡。AspectJ的織入編譯器就是以這種方式織入切面的。
類加載期:切面在目標(biāo)類加載到JVM時(shí)被織入甜害。這種方式需要特
殊的類加載器(ClassLoader)舶掖,它可以在目標(biāo)類被引入應(yīng)用
之前增強(qiáng)該目標(biāo)類的字節(jié)碼。AspectJ 5的加載時(shí)織入(load-time
weaving唾那,LTW)就支持以這種方式織入切面访锻。
運(yùn)行期:切面在應(yīng)用運(yùn)行的某個(gè)時(shí)刻被織入褪尝。一般情況下,在織
入切面時(shí)期犬,AOP容器會(huì)為目標(biāo)對(duì)象動(dòng)態(tài)地創(chuàng)建一個(gè)代理對(duì)象河哑。
Spring AOP就是以這種方式織入切面的。
Spring提供了4種類型的AOP支持:
基于代理的經(jīng)典Spring AOP龟虎;
純POJO切面璃谨;
@AspectJ注解驅(qū)動(dòng)的切面;
注入式AspectJ切面(適用于Spring各版本)鲤妥。
Spring只支持方法級(jí)別的連接點(diǎn)
Spring借助AspectJ的切點(diǎn)表達(dá)式語(yǔ)言來(lái)定義Spring切面:
注意只有execution指示器是實(shí)際執(zhí)行匹配的佳吞,而其他的指示器都是用來(lái)限制匹配的。
使用注解創(chuàng)建切面:
@AspectJ注解進(jìn)行了標(biāo)注棉安。該注解表明Audience不僅僅是一個(gè)POJO底扳,還是一個(gè)切面
Spring使用AspectJ注解來(lái)聲明通知方法:
@Pointcut注解能夠在一個(gè)@AspectJ切面內(nèi)定義可重用的切點(diǎn)。
@Around注解:環(huán)繞通知
它接受ProceedingJoinPoint作為參數(shù)贡耽。衷模。這個(gè)對(duì)象是必須要有的,因?yàn)槟阋谕ㄖ型ㄟ^(guò)它來(lái)調(diào)用被通知的方法蒲赂。通知方法中可以做任何的事情阱冶,當(dāng)要將控制權(quán)交給被通知的方法時(shí),它需要調(diào)用ProceedingJoinPoint的proceed()方法滥嘴。
需要傳入?yún)?shù)時(shí):
利用被稱為引入的AOP概念木蹬,切面可以為Spring bean添加新方法:
@DeclareParents注解由三部分組成:
value屬性指定了哪種類型的bean要引入該接口。在本例中若皱,也就是所有實(shí)現(xiàn)Performance的類型镊叁。(標(biāo)記符后面的加號(hào)表示是Performance的所有子類型,而不是Performance本
身是尖。)
defaultImpl屬性指定了為引入功能提供實(shí)現(xiàn)的類意系。在這里,我們指定的是DefaultEncoreable提供實(shí)現(xiàn)饺汹。
@DeclareParents注解所標(biāo)注的靜態(tài)屬性指明了要引入了接口。在這里痰催,我們所引入的是Encoreable接口兜辞。
Spring的AOP配置元素能夠以非侵入性的方式聲明切面:
第5章 構(gòu)建Spring Web應(yīng)用程序
Spring MVC所經(jīng)歷的所有站點(diǎn):
@EnableWebMvc注解:?jiǎn)⒂肧pring MVC
@Controller注解:聲明控制器
@RequestMapping注解:它的value屬性指定了這個(gè)方法所要處理的請(qǐng)求路徑,method屬性細(xì)化了它所處理的HTTP方法夸溶。
@RequestParam注解:逸吵?連接的參數(shù)
@PathVariable("spittleId"):寫在路徑中的參數(shù)
Java校驗(yàn)API所提供的校驗(yàn)注解:
第6章 渲染W(wǎng)eb視圖
JSP
Thymeleaf
前后端分離:
第7章 Spring MVC的高級(jí)技術(shù)
filter
7.5 跨重定向請(qǐng)求傳遞數(shù)據(jù) redirect: 前綴
第8章 使用Spring Web Flow
Spring Web Flow是Spring MVC的擴(kuò)展岩瘦,它支持開(kāi)發(fā)基于流程的應(yīng)用程序喊衫。它將流程的定義與實(shí)現(xiàn)流程行為的類和視圖分離開(kāi)來(lái)。
流程是由三個(gè)主要元素定義的:狀態(tài)摩泪、轉(zhuǎn)移和流程數(shù)據(jù)
Spring Web Flow可供選擇的狀態(tài):
Spring Web Flow的作用域:
并不是所有的Web應(yīng)用程序都是自由訪問(wèn)的。有時(shí)候韩脑,必須對(duì)用戶進(jìn)行指引氢妈、詢問(wèn)適當(dāng)?shù)膯?wèn)題并基于他們的響應(yīng)將其引導(dǎo)到特定頁(yè)面。在這些情況下段多,應(yīng)用程序不太像一個(gè)菜單選項(xiàng)而更像應(yīng)用程序與用戶之
間的對(duì)話首量。
第9章 保護(hù)Web應(yīng)用——Spring Security
Spring Security被分成了11個(gè)模塊:
過(guò)濾Web請(qǐng)求:DelegatingFilterProxy是一個(gè)特殊的Servlet Filter
@EnableWebSecurity注解將會(huì)啟用Web安全功能。web應(yīng)用下进苍,使用@EnableWebMvcSecurity替代它加缘。
預(yù)先增加驗(yàn)證用戶有以下方法。
使用基于內(nèi)存的用戶存儲(chǔ)
基于數(shù)據(jù)庫(kù)表進(jìn)行認(rèn)證
基于LDAP進(jìn)行認(rèn)證
requiresChannel()方法會(huì)為選定的URL強(qiáng)制使用HTTPS觉啊。
我們可以使用requiresInsecure()代替requiresSecure()方法拣宏,將首頁(yè)聲明為始終通過(guò)HTTP傳送。
防止跨站請(qǐng)求偽造
Spring Security已經(jīng)簡(jiǎn)化了將token放到請(qǐng)求的屬性中這一任務(wù)杠人。如果你使用Thymeleaf作為頁(yè)面模板的話勋乾,只要<form>標(biāo)簽的action屬性添加了Thymeleaf命名空間前綴,那么就會(huì)自動(dòng)生成一個(gè)“_csrf”隱藏域搜吧。
通過(guò)調(diào)用csrf().disable()禁用Spring Security的CSRF防護(hù)功能市俊。
認(rèn)證用戶
重定向到首頁(yè)登陸頁(yè)。
第10章 通過(guò)Spring和JDBC征服數(shù)據(jù)庫(kù)
第16章 RESTful架構(gòu)
@RestController注解:為控制器默認(rèn)設(shè)置消息轉(zhuǎn)換
第18章 WebSocket
WebSocket協(xié)議提供了通過(guò)一個(gè)套接字實(shí)現(xiàn)全雙工通信的功能滤奈。除了其他的功能之外摆昧,它能夠?qū)崿F(xiàn)Web瀏覽器和服務(wù)器之間的異步通信。全雙工意味著服務(wù)器可以發(fā)送消息給瀏覽器蜒程,瀏覽器也可以發(fā)送消息給服務(wù)器绅你。