java框架:超詳細(xì)Spring知識(shí)點(diǎn)匯總

1spring框架概述

1.1什么是spring

lSpring是一個(gè)開源框架,Spring是于2003 年興起的一個(gè)輕量級(jí)的Java 開發(fā)框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來(lái)。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的??蚣艿闹饕獌?yōu)勢(shì)之一就是其分層架構(gòu),分層架構(gòu)允許使用者選擇使用哪一個(gè)組件,同時(shí)為 J2EE 應(yīng)用程序開發(fā)提供集成的框架。Spring使用基本的JavaBean來(lái)完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限于服務(wù)器端的開發(fā)。從簡(jiǎn)單性、可測(cè)試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。Spring的核心是控制反轉(zhuǎn)(IoC)和面向切面(AOP)。簡(jiǎn)單來(lái)說(shuō),Spring是一個(gè)分層的JavaSE/EE full-stack(一站式) 輕量級(jí)開源框架。

l輕量級(jí):與EJB(enterprise javabean ,企業(yè)級(jí)javabean)對(duì)比,依賴資源少,銷毀的資源少。

l分層: 一站式,每一個(gè)層都提供的解決方案

web層:struts,spring-MVC

service層:spring

dao層:hibernate,mybatis , jdbcTemplate

1.2spring由來(lái)

lSpring 是java平臺(tái)上的一個(gè)開源應(yīng)用框架。它的第一個(gè)版本是由Rod Johnson寫出來(lái)的。Rod在他的Expert One-On-One Java EE Design and Development(Java企業(yè)應(yīng)用設(shè)計(jì)與開發(fā)的專家一對(duì)一)一書中首次發(fā)布了這個(gè)框架.

小編是一個(gè)有著5年工作經(jīng)驗(yàn)的java程序員,對(duì)于java,自己有做資料的整合,一個(gè)完整學(xué)習(xí)java的路線,學(xué)習(xí)資料和工具,相信這里有很多學(xué)習(xí)java的小伙伴,我創(chuàng)立了一個(gè)2000人學(xué)習(xí)扣群,479121291。每晚都有java的直播課程。無(wú)論是初級(jí)還是進(jìn)階的小伙伴小編我都?xì)g迎!

1.3spring核心

lSpring的核心是控制反轉(zhuǎn)(IOC: inversion of control)和面向切面(AOP: aspect oriented program)

1.4spring優(yōu)點(diǎn)

l方便解耦,簡(jiǎn)化開發(fā)(高內(nèi)聚低耦合)

?Spring就是一個(gè)大工廠(容器),可以將所有對(duì)象創(chuàng)建和依賴關(guān)系維護(hù),交給Spring管理

?spring工廠是用于生成bean

lAOP編程的支持

?Spring提供面向切面編程,可以方便的實(shí)現(xiàn)對(duì)程序進(jìn)行權(quán)限攔截、運(yùn)行監(jiān)控等功能

l聲明式事務(wù)的支持

?只需要通過配置就可以完成對(duì)事務(wù)的管理,而無(wú)需手動(dòng)編程

l方便程序的測(cè)試

?Spring對(duì)Junit4支持,可以通過注解方便的測(cè)試Spring程序

l方便集成各種優(yōu)秀框架

?Spring不排斥各種優(yōu)秀的開源框架,其內(nèi)部提供了對(duì)各種優(yōu)秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持

l降低JavaEE API的使用難度

?Spring 對(duì)JavaEE開發(fā)中非常難用的一些API(JDBC、JavaMail、遠(yuǎn)程調(diào)用等),都提供了封裝,使這些API應(yīng)用難度大大降低

1.5spring體系結(jié)構(gòu)

Spring框架整體被分為五個(gè)模塊:核心容器(core container), 面向切面編程(aop), 數(shù)據(jù)訪問(date access), web, test.

Spring4去掉了spring3中的struts,添加了messaging和websocket,其他模塊保持不變

Spring的jar包大約20個(gè),每個(gè)都有相應(yīng)的功能,一個(gè)jar還可能依賴了若干其他jar,所以搞清楚它們之間的關(guān)系,配置maven依賴就可以簡(jiǎn)潔明了.

1.5.1 core

core部分包含4個(gè)模塊

spring-core:依賴注入IoC與DI的最基本實(shí)現(xiàn)

spring-beans:Bean工廠與bean的裝配

spring-context:spring的context上下文即IoC容器

spring-expression:spring表達(dá)式語(yǔ)言

它們的完整依賴關(guān)系

因?yàn)閟pring-core依賴了commons-logging,而其他模塊都依賴了spring-core,所以整個(gè)spring框架都依賴了commons-logging,如果有自己的日志實(shí)現(xiàn)如log4j,可以排除對(duì)commons-logging的依賴,沒有日志實(shí)現(xiàn)而排除了commons-logging依賴,編譯報(bào)錯(cuò)

1.5.2 aop

aop部分包含4個(gè)模塊

spring-aop:面向切面編程

spring-aspects:集成AspectJ

spring-instrument:提供一些類級(jí)的工具支持和ClassLoader級(jí)的實(shí)現(xiàn),用于服務(wù)器

spring-instrument-tomcat:針對(duì)tomcat的instrument實(shí)現(xiàn)(包含了spring的tomcat設(shè)備代理)

它們的完整依賴關(guān)系

1.5.3 data access

data access部分包含5個(gè)模塊

spring-jdbc:jdbc的支持

spring-tx:事務(wù)控制

spring-orm:對(duì)象關(guān)系映射,集成orm框架

spring-oxm:對(duì)象xml映射

spring-jms:java消息服務(wù)

它們的完整依賴關(guān)系

1.5.4 web

web包含4個(gè)模塊

spring-web:基礎(chǔ)web功能,如文件上傳

spring-webmvc:mvc實(shí)現(xiàn)

spring-webmvc-portlet:基于portlet的mvc實(shí)現(xiàn)

spring-websocket:為web應(yīng)用提供的高效通信工具

它們的依賴關(guān)系

1.5.5 test

test部分只有一個(gè)模塊,我將spring-context-support也放在這里

spring-test:spring測(cè)試,提供junit與mock測(cè)試功能

spring-context-support:spring額外支持包,比如郵件服務(wù)、視圖解析等

它們的依賴關(guān)系

1.5.6 spring4新增

Spring4去掉了spring3中的struts,添加了messaging和websocket,其他模塊保持不變.

spring-websocket:為web應(yīng)用提供的高效通信工具

spring-messaging:用于構(gòu)建基于消息的應(yīng)用程序

它們的依賴關(guān)系

2Demo1:xml方式配置IOC

2.1什么是IOC

Inversion of control(控制反轉(zhuǎn)), 從字面上來(lái)理解: 當(dāng)一個(gè)對(duì)象創(chuàng)建時(shí), 它所依賴的對(duì)象由外部傳遞給他, 而非自己去創(chuàng)建所依賴的對(duì)象(比如通過new操作). 因此,也可以說(shuō)在對(duì)象如何獲取他所依賴的對(duì)象這件事情上, 控制權(quán)反轉(zhuǎn)了.

2.2導(dǎo)入jar

l4 1(4個(gè)核心jar commons-logging依賴)

如果使用maven管理,只需要配置context

lSpring的jar結(jié)構(gòu)(字節(jié)碼.文檔.源碼)

https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework

2.3搭建項(xiàng)目的基本結(jié)構(gòu)

2.4創(chuàng)建配置文件

l文件名: 任意, 官方推薦使用 applicationContext.xml

l文件位置: 任意, 官方推薦放在classpath(src)下(這個(gè)叫做約定大于配置)

l配置文件內(nèi)容: 引入schema約束,配置bean

基本的IOC功能只需要引入beans約束.

約束文件的位置:

spring-framework-4.1.6.RELEASEdocsspring-framework-referencehtml\xsd-config.html

2.5測(cè)試

加載配置文件創(chuàng)建ApplicationContext上下文對(duì)象

從上下文中獲取對(duì)象

2.6IOC的底層原理

lXml解析

l工廠設(shè)計(jì)模式

l單例模式

l反射

2.7Bean實(shí)例化的三種方式

2.7.1 使用類的無(wú)參構(gòu)造函數(shù)創(chuàng)建對(duì)象(常用!重要!)

如果類中沒有顯示聲明構(gòu)造函數(shù),系統(tǒng)會(huì)為該類提供一個(gè)默認(rèn)的構(gòu)造函數(shù),開發(fā)者為一個(gè)類提供了構(gòu)造函數(shù),系統(tǒng)將不再為該類提供構(gòu)造函數(shù).

如果創(chuàng)建了有參的構(gòu)造函數(shù),沒有顯示聲明無(wú)參空構(gòu)造,會(huì)拋出異常

2.7.2 使用靜態(tài)工廠創(chuàng)建對(duì)象

l需要?jiǎng)?chuàng)建一個(gè)工廠類,并提供一個(gè)靜態(tài)方法返回目標(biāo)類的對(duì)象

lXml文件配置bean的時(shí)候class屬性需要指向工廠類的路徑,同時(shí)需要指定factory-method屬性,屬性值為工廠的靜態(tài)方法

2.7.3 使用實(shí)例工廠創(chuàng)建對(duì)象

創(chuàng)建實(shí)例工廠類,提供一個(gè)非靜態(tài)的方法返回目標(biāo)類的對(duì)象

配置實(shí)例工廠bean

配置目標(biāo)類bean, 配置factory-bean屬性,值指向工廠bean的id;配置factory-method屬性,值為工廠類中的get方法

2.8Bean標(biāo)簽的常用屬性

lid : 給實(shí)例對(duì)象取一個(gè)名字,通過這個(gè)名字來(lái)標(biāo)識(shí)一個(gè)對(duì)象,該屬性值不能包含特殊符號(hào),一般使用首字母小寫的類名

lname(不推薦使用): 功能和id一樣,但是可以包含特殊符號(hào),是為了整合struts框架遺留的,現(xiàn)在基本不用

lclass : 指定配置對(duì)象所在類的全限定名:包名 類名

lscope : 用于配置spring bean的作用域

singleton : 默認(rèn)值,表示該對(duì)象的實(shí)例為單例(如果配置多個(gè)bean,則存在多個(gè)對(duì)象)

prototype : 多例

request: 創(chuàng)建對(duì)象并放到request作用域

session: 創(chuàng)建對(duì)象并放到session作用域

globalSession: 創(chuàng)建對(duì)象并放到globalSssion作用域

Init-method

Destroy-method

Lazy

3DI:依賴注入

3.1Dependency injection.

什么是依賴?

一個(gè)對(duì)象完成業(yè)務(wù)功能需要依賴另一個(gè)對(duì)象,比如service功能需要依賴于dao

什么是注入?

就是在獲取一個(gè)對(duì)象時(shí),該對(duì)象所依賴的實(shí)例已經(jīng)

由spring替我們分配了

3.2屬性注入的兩種方式

set方法注入(重點(diǎn)掌握)

xml方式配置DI時(shí),必須為屬性添加set方法,注解不需要

xml方式配置DI(基本類型):

xml方式配置DI(注入對(duì)象):

xml方式配置DI(復(fù)雜類型)

Xml配置文件:

名稱空間設(shè)置屬性值

Spring2.X以后提供了名稱空間p的屬性輸入方式

l第一步:引入p名稱空間

xmlns:p=''http://www.springframework.org/schema/p''

l第二步:使用p名稱空間

普通屬性: p:屬性名=””

對(duì)象類型屬性: p:屬性名-ref=””

SpEL的方式屬性注入

Spring3.X以后提供了SpEL的方式注入屬性

語(yǔ)法:

有參構(gòu)造函數(shù)注入(了解)

創(chuàng)建無(wú)參構(gòu)造函數(shù)

創(chuàng)建有參構(gòu)造函數(shù)

在xml文件中采用注入

4Demo2: 注解方式配置IOC

4.1導(dǎo)入jar

l4 1(4個(gè)核心jar commons-logging)

lspring-aop : 使用注解會(huì)使用到該jar

4.2創(chuàng)建類

4.3創(chuàng)建配置文件

l在demo1的基礎(chǔ)上添加context約束

l在applicationContext.xml中添加注解的配置(非常重要):

l屬性注解

如果bean的裝配使用xml,依賴的裝配使用注解,可以使用以下配置

該配置只會(huì)掃描屬性上的注解(通常是@Autowired)

4.4配置組件和DI

l在java類上添加@Component(“id”)注解(id可選),告訴spring這是一個(gè)組件,交由spring管理,這一步相當(dāng)于xml當(dāng)中的配置

l除了@Component以外還有其他幾個(gè)注解配置組件:

n@Controller

n@Service

n@Repository

l配置組件之后,如果未指定id,默認(rèn)給對(duì)象配置一個(gè)類名首字母小寫的id,如果以顯式的配置了id,則默認(rèn)的就不存在了

l如果有依賴,在依賴上添加@Autowired注解,使用該注解,沒有set方法也可以

l除了@Autowired,@Resource也可以用來(lái)裝配bean

@Autowired默認(rèn)按類型進(jìn)行裝配(該注解由spring提供),默認(rèn)情況下必須要求依賴對(duì)象存在,如果要允許null值,可以設(shè)置required屬性為false,如:@Autowired(required=false);如果想要使用名稱裝配,可以結(jié)合使用@Qualifier,如:@Autowired@Qualifier(“name”);

@Resource(該注解由j2EE提供),默認(rèn)按照名稱進(jìn)行裝配,名稱可以通過name屬性進(jìn)行指定,如果未指定name屬性,當(dāng)注解寫在字段上是,默認(rèn)取字段名查找,當(dāng)找不到名稱匹配的bean時(shí),才按照類型進(jìn)行裝配.但是如果name屬性一旦指定,將只會(huì)按照名稱進(jìn)行裝配

4.5測(cè)試

5AOP

5.1什么是AOP

lAOP全稱 aspect oriented program,中文名為面向切面編程.

lAOP的OOP的延續(xù),是spring框架中的一個(gè)熱點(diǎn)和優(yōu)勢(shì),利用AOP可以對(duì)業(yè)務(wù)的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各個(gè)部分之間的耦合度降低.提高代碼的復(fù)用性,同時(shí)提高開發(fā)效率

lAOP采取了橫向抽取的機(jī)制,取代了傳統(tǒng)縱向繼承體系的重復(fù)性代碼

l應(yīng)用場(chǎng)景:日志, 事務(wù)管理, 緩存, 性能檢測(cè)等

lSpring AOP 使用純java實(shí)現(xiàn),不需要專門的編譯過程和類加載器,在運(yùn)行期通過動(dòng)態(tài)代理的方式向目標(biāo)類織入增強(qiáng)代碼

lAspectj 是一個(gè)基于java語(yǔ)言的AOP框架,從spring2.0開始,引入了對(duì)于Aspectj的支持

5.2AOP的專有名詞

ltarget : 目標(biāo)類

ljoinpoint : 連接點(diǎn)是指所有可能織入通知的方法,理論上大部分方法都是連接點(diǎn)

lpointcut : 切入點(diǎn), 已經(jīng)被增強(qiáng)(或者說(shuō)織入通知)的方法

ladvice: 通知,增強(qiáng)的方法,比如日志,事務(wù)

laspect : 切面,是指advice和pointcut的結(jié)合

lweaving: 織入,將advice應(yīng)用到目標(biāo)對(duì)象來(lái)創(chuàng)建新的代理對(duì)象的過程

6Demo3: xml方式配置AOP

6.1導(dǎo)入jar

l4 1(4個(gè)核心jar commons-logging)

lSpring的aop jar

nspring-aop > aopalliance(aop聯(lián)盟)

laspects的jar(集成aspectj)

nspring-aspects > aspectjweaver

6.2創(chuàng)建業(yè)務(wù)類和增強(qiáng)類

業(yè)務(wù)類:UserService

增強(qiáng)類:LogAspect

6.3創(chuàng)建配置文件

l添加約束:bean,aop

l配置bean

l配置aop:切點(diǎn) 切面

6.4測(cè)試

6.5通知的類型

lbefore:前置通知,在目標(biāo)方法被調(diào)用之前調(diào)用通知功能

lafter:后置通知,在目標(biāo)方法完成之后調(diào)用通知,不關(guān)心目標(biāo)方法的輸出

lafter-returning:返回通知,在目標(biāo)方法成功執(zhí)行之后調(diào)用通知

lafter-throwing:異常通知,在目標(biāo)方法拋出異常之后執(zhí)行通知

laround:環(huán)繞通知,在調(diào)用前后都會(huì)執(zhí)行

n環(huán)繞通知接收一個(gè)參數(shù): ProceedingJoinPoint

6.6切入點(diǎn)表達(dá)式

lexpression=''execution(* service.UserService.addUser(..))''

[訪問修飾符] 方法返回類型 包名.類名.方法名(參數(shù))

訪問修飾符通常省略

l幾種常用寫法

7Demo4: 注解方式配置AOP

7.1導(dǎo)入jar

l4 1(4個(gè)核心jar commons-logging)

lSpring的aop jar

nspring-aop > aopalliance(aop聯(lián)盟)

laspects的jar(集成aspectj)

nspring-aspects > aspectjweaver

7.2創(chuàng)建業(yè)務(wù)類和增強(qiáng)類

業(yè)務(wù)類:UserService

增強(qiáng)類:LogAspect

7.3配置組件和切面

l創(chuàng)建配置文件

l引入約束:beans, aop, context

l配置組件的包掃描:

n

l配置開啟aop自動(dòng)代理

n

l在組件上添加@Component注解

l在切面上添加@Aspect注解

l在通知類的方法上添加切入點(diǎn)表達(dá)式的注解

7.4測(cè)試

8JDBCTemplate

lSpring提供了用于操作JDBC的工具類,類似于DBUtils

lSpring對(duì)于不同持久化技術(shù)提供了不同的模板類

8.1回顧JDBC操作數(shù)據(jù)庫(kù)

1.加載驅(qū)動(dòng)類

2.傳入?yún)?shù)信息獲取連接

3.通過連接獲取PrepareStatement對(duì)象

4.通過PrepareStatemen對(duì)象執(zhí)行sql語(yǔ)句

5.從ResultSet獲取結(jié)果集

8.2通過JDBCTemplate操作數(shù)據(jù)庫(kù)

8.2.1 導(dǎo)入jar

l4 1

lSpring-jdbc

lSpring-tx 事務(wù)包

lmysql.connector數(shù)據(jù)庫(kù)驅(qū)動(dòng)包

8.2.2 創(chuàng)建DriverManagerDataSource對(duì)象,設(shè)置數(shù)據(jù)庫(kù)信息:驅(qū)動(dòng),數(shù)據(jù)庫(kù)地址,賬號(hào),密碼

8.2.3 創(chuàng)建JdbcTemplate對(duì)象,設(shè)置數(shù)據(jù)源

8.2.4調(diào)用JdbcTemplate對(duì)象中的方法實(shí)現(xiàn)操作

l增(JdbcTemplate.update)

String sql = “insert into user values(null, ?, ?)”;

int row = jdbcTemplate.update(sql, “andy”, 50);

l刪(JdbcTemplate.update)

String sql = “delete from user where name=?”;

int row = jdbcTemplate.update(sql, “andy”);

l改(JdbcTemplate.update)

String sql = ''update user set age=? where name=?'';

int row = jdbcTemplate.update(sql, 18, ''jiayu'');

l查1(查詢返回某一個(gè)指定類型的值)

jdbcTemplate.queryForObject( String sql, Class requireType)

比如 select count(*) from user,返回值是int, 則第二個(gè)參數(shù)傳Integer.class

l查2(查詢一個(gè)對(duì)象)

jdbcTemplate.queryForObject(String sql, RowMapper rowMapper, Object ...args)

調(diào)用該方法,需要注意的是該方法需要傳入一個(gè)RowMapper類型的對(duì)象,spring只提供了接口,需要自己手動(dòng)去實(shí)現(xiàn),寫法相當(dāng)于jdbc獲取結(jié)果當(dāng)中while(resultSet.next()){}循環(huán)體內(nèi)的部分

l查3(查詢一個(gè)對(duì)象集合)

jdbcTemplate.query(String sql, RowMapper )

8.3以配置方式注入dataSource和jdbcTemplate

9Spring的事務(wù)管理

9.1什么是事務(wù)

一組對(duì)于數(shù)據(jù)庫(kù)的操作,是最小的數(shù)據(jù)庫(kù)操作單元.要么都成功,有么都不執(zhí)行.

Mysql是支持事務(wù)的

Mysql是事務(wù)是自動(dòng)提交的.

在mysql的jdbc當(dāng)中進(jìn)行事務(wù)管理:

1.手動(dòng)開啟事務(wù)

2.手動(dòng)提交事務(wù)

3.回滾

9.2事務(wù)的特性(ACID)

原子性: 一個(gè)事務(wù)單元里面的多個(gè)數(shù)據(jù)庫(kù)操作,不可分割

隔離性: 一個(gè)事務(wù)操作不能影響其他事務(wù)

一致性:

持久性:

9.3并發(fā)事務(wù)下可能出現(xiàn)的問題

臟讀: 是一個(gè)事務(wù)讀到了另一個(gè)事務(wù)沒有提交的數(shù)據(jù)

不可重復(fù)讀: 針對(duì)的是記錄的修改操作

幻讀: 針對(duì)的是數(shù)據(jù)增刪操作

9.4解決方法:設(shè)置數(shù)據(jù)的隔離級(jí)別

讀未提交: 一個(gè)問題都沒解決

讀已提交: 解決了臟讀的問題

可重復(fù)讀: 解決了不可重復(fù)讀和臟讀的問題

串行化: 解決了所有問題..

數(shù)據(jù)庫(kù)是有默認(rèn)的隔離級(jí)別的:

Mysql : 可重復(fù)讀

Oracle: 讀已提交

9.5JDBC當(dāng)中的事務(wù)處理

開啟事務(wù)

Connection.setAutoCommit(false)

提交事務(wù)

Connection.commit()

事務(wù)回滾

Connection.rollback()

9.6Spring當(dāng)中的事務(wù)處理

平臺(tái)事務(wù)管理器:

PlatformTransactionManager

9.7三種事務(wù)處理方案

1.編程式事務(wù)

2.聲明式事務(wù)

2.1 xml方式配置事務(wù)

2.2注解方式配置事務(wù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,644評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,279評(píng)論 6 342
  • 1.1 Spring IoC容器和bean簡(jiǎn)介 本章介紹了Spring Framework實(shí)現(xiàn)的控制反轉(zhuǎn)(IoC)...
    起名真是難閱讀 2,674評(píng)論 0 8
  • 1.老大的寫作思路 理念。成長(zhǎng)的兩種模式→期待模式符合最小阻力之路,最小阻力之路是什么?如何走最小阻之路? 2.如...
    拍謝少女閱讀 737評(píng)論 0 51
  • 前段時(shí)間閨蜜小聚,聊著家常,談著愛好,其中有喜歡健身的,養(yǎng)花的,美容的…被問到我,一時(shí)語(yǔ)塞,其實(shí)我的愛好...
    筱麥閱讀 369評(píng)論 0 5

友情鏈接更多精彩內(nèi)容