java框架:超詳細Spring知識點彙總

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註解方式配置事務

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