1spring框架概述
1.1什么是spring
lSpring是一個開源框架,Spring是于2003 年興起的一個輕量級的Java 開發(fā)框架赏参,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來枣氧。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。框架的主要優(yōu)勢之一就是其分層架構(gòu),分層架構(gòu)允許使用者選擇使用哪一個組件抄谐,同時為 J2EE 應(yīng)用程序開發(fā)提供集成的框架。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情瞧栗。然而斯稳,Spring的用途不僅限于服務(wù)器端的開發(fā)海铆。從簡單性迹恐、可測試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益卧斟。Spring的核心是控制反轉(zhuǎn)(IoC)和面向切面(AOP)殴边。簡單來說憎茂,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。
l輕量級:與EJB(enterprise javabean ,企業(yè)級javabean)對比锤岸,依賴資源少竖幔,銷毀的資源少。
l分層: 一站式是偷,每一個層都提供的解決方案
web層:struts拳氢,spring-MVC
service層:spring
dao層:hibernate,mybatis 蛋铆, jdbcTemplate
1.2spring由來
lSpring 是java平臺上的一個開源應(yīng)用框架馋评。它的第一個版本是由Rod Johnson寫出來的。Rod在他的Expert One-On-One Java EE Design and Development(Java企業(yè)應(yīng)用設(shè)計與開發(fā)的專家一對一)一書中首次發(fā)布了這個框架.
小編是一個有著5年工作經(jīng)驗的java程序員刺啦,對于java留特,自己有做資料的整合,一個完整學(xué)習(xí)java的路線玛瘸,學(xué)習(xí)資料和工具蜕青,相信這里有很多學(xué)習(xí)java的小伙伴,我創(chuàng)立了一個2000人學(xué)習(xí)扣群糊渊,479121291右核。每晚都有java的直播課程。無論是初級還是進階的小伙伴小編我都歡迎渺绒!
1.3spring核心
lSpring的核心是控制反轉(zhuǎn)(IOC: inversion of control)和面向切面(AOP: aspect oriented program)
1.4spring優(yōu)點
l方便解耦蒙兰,簡化開發(fā)(高內(nèi)聚低耦合)
?Spring就是一個大工廠(容器),可以將所有對象創(chuàng)建和依賴關(guān)系維護芒篷,交給Spring管理
?spring工廠是用于生成bean
lAOP編程的支持
?Spring提供面向切面編程搜变,可以方便的實現(xiàn)對程序進行權(quán)限攔截、運行監(jiān)控等功能
l聲明式事務(wù)的支持
?只需要通過配置就可以完成對事務(wù)的管理针炉,而無需手動編程
l方便程序的測試
?Spring對Junit4支持挠他,可以通過注解方便的測試Spring程序
l方便集成各種優(yōu)秀框架
?Spring不排斥各種優(yōu)秀的開源框架,其內(nèi)部提供了對各種優(yōu)秀框架(如:Struts篡帕、Hibernate殖侵、MyBatis、Quartz等)的直接支持
l降低JavaEE API的使用難度
?Spring 對JavaEE開發(fā)中非常難用的一些API(JDBC镰烧、JavaMail拢军、遠程調(diào)用等),都提供了封裝怔鳖,使這些API應(yīng)用難度大大降低
1.5spring體系結(jié)構(gòu)
Spring框架整體被分為五個模塊:核心容器(core container), 面向切面編程(aop), 數(shù)據(jù)訪問(date access), web, test.
Spring4去掉了spring3中的struts,添加了messaging和websocket,其他模塊保持不變
Spring的jar包大約20個,每個都有相應(yīng)的功能,一個jar還可能依賴了若干其他jar,所以搞清楚它們之間的關(guān)系,配置maven依賴就可以簡潔明了.
1.5.1 core
core部分包含4個模塊
spring-core:依賴注入IoC與DI的最基本實現(xiàn)
spring-beans:Bean工廠與bean的裝配
spring-context:spring的context上下文即IoC容器
spring-expression:spring表達式語言
它們的完整依賴關(guān)系
因為spring-core依賴了commons-logging茉唉,而其他模塊都依賴了spring-core,所以整個spring框架都依賴了commons-logging,如果有自己的日志實現(xiàn)如log4j度陆,可以排除對commons-logging的依賴艾凯,沒有日志實現(xiàn)而排除了commons-logging依賴,編譯報錯
1.5.2 aop
aop部分包含4個模塊
spring-aop:面向切面編程
spring-aspects:集成AspectJ
spring-instrument:提供一些類級的工具支持和ClassLoader級的實現(xiàn)懂傀,用于服務(wù)器
spring-instrument-tomcat:針對tomcat的instrument實現(xiàn)(包含了spring的tomcat設(shè)備代理)
它們的完整依賴關(guān)系
1.5.3 data access
data access部分包含5個模塊
spring-jdbc:jdbc的支持
spring-tx:事務(wù)控制
spring-orm:對象關(guān)系映射趾诗,集成orm框架
spring-oxm:對象xml映射
spring-jms:java消息服務(wù)
它們的完整依賴關(guān)系
1.5.4 web
web包含4個模塊
spring-web:基礎(chǔ)web功能,如文件上傳
spring-webmvc:mvc實現(xiàn)
spring-webmvc-portlet:基于portlet的mvc實現(xiàn)
spring-websocket:為web應(yīng)用提供的高效通信工具
它們的依賴關(guān)系
1.5.5 test
test部分只有一個模塊蹬蚁,我將spring-context-support也放在這里
spring-test:spring測試恃泪,提供junit與mock測試功能
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)), 從字面上來理解: 當(dāng)一個對象創(chuàng)建時, 它所依賴的對象由外部傳遞給他, 而非自己去創(chuàng)建所依賴的對象(比如通過new操作). 因此,也可以說在對象如何獲取他所依賴的對象這件事情上, 控制權(quán)反轉(zhuǎn)了.
2.2導(dǎo)入jar
l4 1(4個核心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搭建項目的基本結(jié)構(gòu)
2.4創(chuàng)建配置文件
l文件名: 任意, 官方推薦使用 applicationContext.xml
l文件位置: 任意, 官方推薦放在classpath(src)下(這個叫做約定大于配置)
l配置文件內(nèi)容: 引入schema約束,配置bean
基本的IOC功能只需要引入beans約束.
約束文件的位置:
spring-framework-4.1.6.RELEASEdocsspring-framework-referencehtml\xsd-config.html
2.5測試
加載配置文件創(chuàng)建ApplicationContext上下文對象
從上下文中獲取對象
2.6IOC的底層原理
lXml解析
l工廠設(shè)計模式
l單例模式
l反射
2.7Bean實例化的三種方式
2.7.1 使用類的無參構(gòu)造函數(shù)創(chuàng)建對象(常用!重要!)
如果類中沒有顯示聲明構(gòu)造函數(shù),系統(tǒng)會為該類提供一個默認的構(gòu)造函數(shù),開發(fā)者為一個類提供了構(gòu)造函數(shù),系統(tǒng)將不再為該類提供構(gòu)造函數(shù).
如果創(chuàng)建了有參的構(gòu)造函數(shù),沒有顯示聲明無參空構(gòu)造,會拋出異常
2.7.2 使用靜態(tài)工廠創(chuàng)建對象
l需要創(chuàng)建一個工廠類,并提供一個靜態(tài)方法返回目標類的對象
lXml文件配置bean的時候class屬性需要指向工廠類的路徑,同時需要指定factory-method屬性,屬性值為工廠的靜態(tài)方法
2.7.3 使用實例工廠創(chuàng)建對象
創(chuàng)建實例工廠類,提供一個非靜態(tài)的方法返回目標類的對象
配置實例工廠bean
配置目標類bean, 配置factory-bean屬性,值指向工廠bean的id;配置factory-method屬性,值為工廠類中的get方法
2.8Bean標簽的常用屬性
lid : 給實例對象取一個名字,通過這個名字來標識一個對象,該屬性值不能包含特殊符號,一般使用首字母小寫的類名
lname(不推薦使用): 功能和id一樣,但是可以包含特殊符號,是為了整合struts框架遺留的,現(xiàn)在基本不用
lclass : 指定配置對象所在類的全限定名:包名 類名
lscope : 用于配置spring bean的作用域
singleton : 默認值,表示該對象的實例為單例(如果配置多個bean,則存在多個對象)
prototype : 多例
request: 創(chuàng)建對象并放到request作用域
session: 創(chuàng)建對象并放到session作用域
globalSession: 創(chuàng)建對象并放到globalSssion作用域
Init-method
Destroy-method
Lazy
3DI:依賴注入
3.1Dependency injection.
什么是依賴?
一個對象完成業(yè)務(wù)功能需要依賴另一個對象,比如service功能需要依賴于dao
什么是注入?
就是在獲取一個對象時,該對象所依賴的實例已經(jīng)
由spring替我們分配了
3.2屬性注入的兩種方式
set方法注入(重點掌握)
xml方式配置DI時,必須為屬性添加set方法,注解不需要
xml方式配置DI(基本類型):
xml方式配置DI(注入對象):
xml方式配置DI(復(fù)雜類型)
Xml配置文件:
名稱空間設(shè)置屬性值
Spring2.X以后提供了名稱空間p的屬性輸入方式
l第一步:引入p名稱空間
xmlns:p=''http://www.springframework.org/schema/p''
l第二步:使用p名稱空間
普通屬性: p:屬性名=””
對象類型屬性: p:屬性名-ref=””
SpEL的方式屬性注入
Spring3.X以后提供了SpEL的方式注入屬性
語法:
有參構(gòu)造函數(shù)注入(了解)
創(chuàng)建無參構(gòu)造函數(shù)
創(chuàng)建有參構(gòu)造函數(shù)
在xml文件中采用注入
4Demo2: 注解方式配置IOC
4.1導(dǎo)入jar
l4 1(4個核心jar commons-logging)
lspring-aop : 使用注解會使用到該jar
4.2創(chuàng)建類
4.3創(chuàng)建配置文件
l在demo1的基礎(chǔ)上添加context約束
l在applicationContext.xml中添加注解的配置(非常重要):
l屬性注解
如果bean的裝配使用xml,依賴的裝配使用注解,可以使用以下配置
該配置只會掃描屬性上的注解(通常是@Autowired)
4.4配置組件和DI
l在java類上添加@Component(“id”)注解(id可選),告訴spring這是一個組件,交由spring管理,這一步相當(dāng)于xml當(dāng)中的配置
l除了@Component以外還有其他幾個注解配置組件:
n@Controller
n@Service
n@Repository
l配置組件之后,如果未指定id,默認給對象配置一個類名首字母小寫的id,如果以顯式的配置了id,則默認的就不存在了
l如果有依賴,在依賴上添加@Autowired注解,使用該注解,沒有set方法也可以
l除了@Autowired,@Resource也可以用來裝配bean
@Autowired默認按類型進行裝配(該注解由spring提供),默認情況下必須要求依賴對象存在,如果要允許null值,可以設(shè)置required屬性為false,如:@Autowired(required=false);如果想要使用名稱裝配,可以結(jié)合使用@Qualifier,如:@Autowired@Qualifier(“name”);
@Resource(該注解由j2EE提供),默認按照名稱進行裝配,名稱可以通過name屬性進行指定,如果未指定name屬性,當(dāng)注解寫在字段上是,默認取字段名查找,當(dāng)找不到名稱匹配的bean時,才按照類型進行裝配.但是如果name屬性一旦指定,將只會按照名稱進行裝配
4.5測試
5AOP
5.1什么是AOP
lAOP全稱 aspect oriented program,中文名為面向切面編程.
lAOP的OOP的延續(xù),是spring框架中的一個熱點和優(yōu)勢,利用AOP可以對業(yè)務(wù)的各個部分進行隔離,從而使得業(yè)務(wù)邏輯各個部分之間的耦合度降低.提高代碼的復(fù)用性,同時提高開發(fā)效率
lAOP采取了橫向抽取的機制,取代了傳統(tǒng)縱向繼承體系的重復(fù)性代碼
l應(yīng)用場景:日志, 事務(wù)管理, 緩存, 性能檢測等
lSpring AOP 使用純java實現(xiàn),不需要專門的編譯過程和類加載器,在運行期通過動態(tài)代理的方式向目標類織入增強代碼
lAspectj 是一個基于java語言的AOP框架,從spring2.0開始,引入了對于Aspectj的支持
5.2AOP的專有名詞
ltarget : 目標類
ljoinpoint : 連接點是指所有可能織入通知的方法,理論上大部分方法都是連接點
lpointcut : 切入點, 已經(jīng)被增強(或者說織入通知)的方法
ladvice: 通知,增強的方法,比如日志,事務(wù)
laspect : 切面,是指advice和pointcut的結(jié)合
lweaving: 織入,將advice應(yīng)用到目標對象來創(chuàng)建新的代理對象的過程
6Demo3: xml方式配置AOP
6.1導(dǎo)入jar
l4 1(4個核心jar commons-logging)
lSpring的aop jar
nspring-aop > aopalliance(aop聯(lián)盟)
laspects的jar(集成aspectj)
nspring-aspects > aspectjweaver
6.2創(chuàng)建業(yè)務(wù)類和增強類
業(yè)務(wù)類:UserService
增強類:LogAspect
6.3創(chuàng)建配置文件
l添加約束:bean,aop
l配置bean
l配置aop:切點 切面
6.4測試
6.5通知的類型
lbefore:前置通知,在目標方法被調(diào)用之前調(diào)用通知功能
lafter:后置通知,在目標方法完成之后調(diào)用通知,不關(guān)心目標方法的輸出
lafter-returning:返回通知,在目標方法成功執(zhí)行之后調(diào)用通知
lafter-throwing:異常通知,在目標方法拋出異常之后執(zhí)行通知
laround:環(huán)繞通知,在調(diào)用前后都會執(zhí)行
n環(huán)繞通知接收一個參數(shù): ProceedingJoinPoint
6.6切入點表達式
lexpression=''execution(* service.UserService.addUser(..))''
[訪問修飾符] 方法返回類型 包名.類名.方法名(參數(shù))
訪問修飾符通常省略
l幾種常用寫法
7Demo4: 注解方式配置AOP
7.1導(dǎo)入jar
l4 1(4個核心jar commons-logging)
lSpring的aop jar
nspring-aop > aopalliance(aop聯(lián)盟)
laspects的jar(集成aspectj)
nspring-aspects > aspectjweaver
7.2創(chuàng)建業(yè)務(wù)類和增強類
業(yè)務(wù)類:UserService
增強類:LogAspect
7.3配置組件和切面
l創(chuàng)建配置文件
l引入約束:beans, aop, context
l配置組件的包掃描:
n
l配置開啟aop自動代理
n
l在組件上添加@Component注解
l在切面上添加@Aspect注解
l在通知類的方法上添加切入點表達式的注解
7.4測試
8JDBCTemplate
lSpring提供了用于操作JDBC的工具類,類似于DBUtils
lSpring對于不同持久化技術(shù)提供了不同的模板類
8.1回顧JDBC操作數(shù)據(jù)庫
1.加載驅(qū)動類
2.傳入?yún)?shù)信息獲取連接
3.通過連接獲取PrepareStatement對象
4.通過PrepareStatemen對象執(zhí)行sql語句
5.從ResultSet獲取結(jié)果集
8.2通過JDBCTemplate操作數(shù)據(jù)庫
8.2.1 導(dǎo)入jar
l4 1
lSpring-jdbc
lSpring-tx 事務(wù)包
lmysql.connector數(shù)據(jù)庫驅(qū)動包
8.2.2 創(chuàng)建DriverManagerDataSource對象,設(shè)置數(shù)據(jù)庫信息:驅(qū)動,數(shù)據(jù)庫地址,賬號,密碼
8.2.3 創(chuàng)建JdbcTemplate對象,設(shè)置數(shù)據(jù)源
8.2.4調(diào)用JdbcTemplate對象中的方法實現(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(查詢返回某一個指定類型的值)
jdbcTemplate.queryForObject( String sql, Class requireType)
比如 select count(*) from user,返回值是int, 則第二個參數(shù)傳Integer.class
l查2(查詢一個對象)
jdbcTemplate.queryForObject(String sql, RowMapper rowMapper, Object ...args)
調(diào)用該方法,需要注意的是該方法需要傳入一個RowMapper類型的對象,spring只提供了接口,需要自己手動去實現(xiàn),寫法相當(dāng)于jdbc獲取結(jié)果當(dāng)中while(resultSet.next()){}循環(huán)體內(nèi)的部分
l查3(查詢一個對象集合)
jdbcTemplate.query(String sql, RowMapper )
8.3以配置方式注入dataSource和jdbcTemplate
9Spring的事務(wù)管理
9.1什么是事務(wù)
一組對于數(shù)據(jù)庫的操作,是最小的數(shù)據(jù)庫操作單元.要么都成功,有么都不執(zhí)行.
Mysql是支持事務(wù)的
Mysql是事務(wù)是自動提交的.
在mysql的jdbc當(dāng)中進行事務(wù)管理:
1.手動開啟事務(wù)
2.手動提交事務(wù)
3.回滾
9.2事務(wù)的特性(ACID)
原子性: 一個事務(wù)單元里面的多個數(shù)據(jù)庫操作,不可分割
隔離性: 一個事務(wù)操作不能影響其他事務(wù)
一致性:
持久性:
9.3并發(fā)事務(wù)下可能出現(xiàn)的問題
臟讀: 是一個事務(wù)讀到了另一個事務(wù)沒有提交的數(shù)據(jù)
不可重復(fù)讀: 針對的是記錄的修改操作
幻讀: 針對的是數(shù)據(jù)增刪操作
9.4解決方法:設(shè)置數(shù)據(jù)的隔離級別
讀未提交: 一個問題都沒解決
讀已提交: 解決了臟讀的問題
可重復(fù)讀: 解決了不可重復(fù)讀和臟讀的問題
串行化: 解決了所有問題..
數(shù)據(jù)庫是有默認的隔離級別的:
Mysql : 可重復(fù)讀
Oracle: 讀已提交
9.5JDBC當(dāng)中的事務(wù)處理
開啟事務(wù)
Connection.setAutoCommit(false)
提交事務(wù)
Connection.commit()
事務(wù)回滾
Connection.rollback()
9.6Spring當(dāng)中的事務(wù)處理
平臺事務(wù)管理器:
PlatformTransactionManager
9.7三種事務(wù)處理方案
1.編程式事務(wù)
2.聲明式事務(wù)
2.1 xml方式配置事務(wù)
2.2注解方式配置事務(wù)