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