1. 程式人生 > >java框架:超詳細Spring知識點彙總

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企業應用設計與開發的專家一對一)一書中首次釋出了這個框架.

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:用於構建基於訊息的應用程式

它們的依賴關係

2Demo1xml方式配置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

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="userAction" class="com.cdsxt.action.UserAction"></bean>

</beans>

2.5測試

載入配置檔案建立ApplicationContext上下文物件

從上下文中獲取物件

public class TestIoc {

public static void main(String[] args) {

ApplicationContext context =

new ClassPathXmlApplicationContext("applicationContext.xml");

UserAction us = (UserAction)context.getBean("userAction");

us.addUser();

}

}

2.6IOC的底層原理

lXml解析

l工廠設計模式

l單例模式

l反射

2.7Bean例項化的三種方式

2.7.1 使用類的無參建構函式建立物件(常用!重要!)

如果類中沒有顯示宣告建構函式,系統會為該類提供一個預設的建構函式,開發者為一個類提供了建構函式,系統將不再為該類提供建構函式.

如果建立了有參的建構函式,沒有顯示宣告無參空構造,會丟擲異常

Caused by: java.lang.NoSuchMethodException: com.cdsxt.action.UserAction.<init>()

at java.lang.Class.getConstructor0(Class.java:3082)

at java.lang.Class.getDeclaredConstructor(Class.java:2178)

at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:80)

... 14 more

2.7.2 使用靜態工廠建立物件

l需要建立一個工廠類,並提供一個靜態方法返回目標類的物件

lXml檔案配置bean的時候class屬性需要指向工廠類的路徑,同時需要指定factory-method屬性,屬性值為工廠的靜態方法

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="userAction" class="com.cdsxt.action.UserAction"></bean>

<!-- 靜態工廠建立bean -->

<beanid="userAction1" class="com.cdsxt.factory.UserActionFactory" factory-method="getUserAction"></bean>

</beans>

2.7.3 使用例項工廠建立物件

建立例項工廠類,提供一個非靜態的方法返回目標類的物件

配置例項工廠bean

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

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="userAction" class="com.cdsxt.action.UserAction"></bean>

<!-- 例項工廠建立bean -->

<bean id="userActionFactory" class="com.cdsxt.factory.UserActionFactory"></bean>

<bean id="userAction1" factory-bean="userActionFactory" factory-method="getUserAction"></bean>

</beans>

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 version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- 屬性注入(基本型別) -->

<bean id="phone" class="com.cdsxt.po.Phone">

<property name="name" value="xiaomi"></property>

<property name="price" value="2888.00"></property>

</bean>

</beans>

xml方式配置DI(注入物件):

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--屬性注入 物件型別 -->

<bean id="userAction" class="com.cdsxt.action.UserAction">

<property name="userService" ref="userService"></property>

</bean>

<bean id="userService" class="com.cdsxt.service.UserService"></bean>

</beans>

xml方式配置DI(複雜型別)

import java.util.List;

import java.util.Map;

import java.util.Properties;

public class Dependency {

private int[] array;

private List<String> list;

private Map<String, String> map;

private Properties properties;

public int[] getArray() {

return array;

}

public void setArray(int[] array) {

this.array = array;

}

public List<String> getList() {

return list;

}

public void setList(List<String> list) {

this.list = list;

}

public Map<String, String> getMap() {

return map;

}

public void setMap(Map<String, String> map) {

this.map = map;

}

public Properties getProperties() {

return properties;

}

public void setProperties(Properties properties) {

this.properties = properties;

}

}

Xml配置檔案:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="dependency" class="com.cdsxt.po.Dependency">

<!-- 注入陣列 -->

<property name="array">

<array>

<value>1</value>

<value>2</value>

<value>3</value>

</array>

</property>

<!-- 注入list -->

<property name="list">

<list>

<value>list1</value>

<value>list2</value>

<value>list3</value>

</list>

</property>

<!-- 注入map -->

<property name="map">

<map>

<entry key="k1" value="value1"></entry>

<entry key="k2" value="value2"></entry>

<entry key="k3" value="value3"></entry>

</map>

</property>

<!-- 注入properties -->

<property name="properties">

<props>

<prop key="p1">v1</prop>

<prop key="p2">v2</prop>

<prop key="p3">v3</prop>

</props>

</property>

</bean>

</beans>

名稱空間設定屬性值

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

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

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

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

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

物件型別屬性: p:屬性名-ref=””

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

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

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- p名稱空間注入 -->

<bean id="phone" class="com.cdsxt.po.Phone" p:name="Iphone" p:price="8888.88"/>

<bean id="userAction" class="com.cdsxt.action.UserAction" p:userService-ref="userService" />

<bean id="userService" class="com.cdsxt.service.UserService"></bean>

</beans>

SpEL的方式屬性注入

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

語法:

<property name=”屬性名” value=”#{ }”>

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- SpEl注入屬性 -->

<bean id="phone" class="com.cdsxt.po.Phone">

<!--字串 -->

<property name="name" value="#{'huawei'}"></property>

<!-- 數字 -->

<property name="price" value="#{8888.88}"></property>

</bean>

<bean id="userAction" class="com.cdsxt.action.UserAction">

<!--物件 -->

<property name="userService" value="#{userService}"></property>

</bean>

<bean id="userService" class="com.cdsxt.service.UserService"></bean>

</beans>

有參建構函式注入(瞭解)

建立無參建構函式

建立有參建構函式

在xml檔案中採用<constructor-arg name=”” value=”” />注入

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- 有參建構函式注入 -->

<bean id="phone1" class="com.cdsxt.po.Phone">

<constructor-arg value="meizu"></constructor-arg>

<constructor-arg value="2222.22"></constructor-arg>

</bean>

</beans>

4Demo2: 註解方式配置IOC

4.1匯入jar

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

lspring-aop : 使用註解會使用到該jar

4.2建立類

4.3建立配置檔案

l在demo1的基礎上新增context約束

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

<context:component-scan base-package=”要掃描的包”>

l屬性註解

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

<context:annotation-config>

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

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->

<context:component-scan base-package="com.cdsxt"></context:component-scan>

</beans>

4.4配置元件和DI

l在java類上新增@Component(“id”)註解(id可選),告訴spring這是一個元件,交由spring管理,這一步相當於xml當中的<bean>配置

l除了@Component以外還有其他幾個註解配置元件:

[email protected]

[email protected]

[email protected]

l配置元件之後,如果未指定id,預設給物件配置一個類名首字母小寫的id,如果以顯式的配置了id,則預設的就不存在了

l如果有依賴,在依賴上新增@Autowired註解,使用該註解,沒有set方法也可以

l除了@Autowired,@Resource也可以用來裝配bean

@Autowired預設按型別進行裝配(該註解由spring提供),預設情況下必須要求依賴物件存在,如果要允許null值,可以設定required屬性為false,如:@Autowired(required=false);如果想要使用名稱裝配,可以結合使用@Qualifier,如:@[email protected](“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:切點+切面

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->

<bean id="userService" class="com.cdsxt.service.UserService"></bean>

<bean id="logAspect" class="com.cdsxt.aspect.LogAspect"></bean>

<!-- 配置aop -->

<aop:config>

<!--配置切點 -->

<aop:pointcut expression="execution(* com.cdsxt.service.UserService.addUser(..))" id="userServiceAddPointcut"/>

<!-- 配置切面:切點 + 通知 -->

<aop:aspect ref="logAspect" >

<aop:before method="log" pointcut-ref="userServiceAddPointcut"/>

</aop:aspect>

</aop:config>

</beans>

6.4測試

6.5通知的型別

lbefore:前置通知,在目標方法被呼叫之前呼叫通知功能

lafter:後置通知,在目標方法完成之後呼叫通知,不關心目標方法的輸出

lafter-returning:返回通知,在目標方法成功執行之後呼叫通知

lafter-throwing:異常通知,在目標方法丟擲異常之後執行通知

laround:環繞通知,在呼叫前後都會執行

n環繞通知接收一個引數: ProceedingJoinPoint

6.6切入點表示式

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

[訪問修飾符] 方法返回型別 包名.類名.方法名(引數)

訪問修飾符通常省略

l幾種常用寫法

n* com.sxt.service.UserService.addUser(..)

n* com.sxt.service.UserService.*(..)

n* com.sxt.service.UserService.add*(..)

n* com.sxt.service.UserService.*do(..)

n* com.sxt.service.*.*do(..)

n* com.sxt.service.*Impl.*(..)

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<context:component-scan base-package=”” />

l配置開啟aop自動代理

n<aop:aspectj-autoproxy />

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<T> requireType)

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

l查2(查詢一個物件)

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

呼叫該方法,需要注意的是該方法需要傳入一個RowMapper型別的物件,spring只提供了介面,需要自己手動去實現,寫法相當於jdbc獲取結果當中while(resultSet.next()){}迴圈體內的部分

l查3(查詢一個物件集合)

jdbcTemplate.query(String sql, RowMapper<T> )

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

相關推薦

java框架詳細Spring知識點彙總

1spring框架概述1.1什麼是springlSpring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是為了解決

Java框架-代理模式詳細介紹、Spring的AOP

1. 代理模式詳介 1.1 分類和作用 分類:靜態代理、jdk動態代理(介面代理)、cglib動態代理(子類代理)技術 使用代理的原因:實際開發中通常都會呼叫別人編寫的程式碼/框架來完成業務需求。很多情況是需要對這些程式碼/框架進行微調或擴充套件,而如果修改原始碼很容易

Java集合框架總結—詳細-適合面試

Set和List介面是Collection介面派生的兩個子介面,Queue是Java提供的佇列實現,類似於List。Map實現類用於儲存具有對映關係的資料(key-value)。   2、Set、List和Map可以看做集合的三大類。     List集合是有序集合,集合中的元素可以重複,訪問集合中的元素可以

三大框架Struts+Hibernate+Spring(1)

orm 個數 可擴展 底層 cmp ioc con bsp 鼓勵 三大框架:Struts+Hibernate+Spring Java三大框架主要用來做WEN應用。 Struts主要負責表示層的顯示 Spring利用它的IOC和AOP來處理控制業務(負責對數據庫的操

java框架學習之路——Spring的體系結構

Java spring 分類:java框架學習Spring的體系結構Spring是一個開源的輕量級框架Spring項目開發流程:創建項目——>添加必須的類庫jar包——>創建源文件編程調用庫——>創建bean的配置文件——>運行調試核心特征:1、AOP:面向切面編程2、IOC:

漲薪必備|給你一份詳細Spring Boot知識清單

在過去兩三年的 Spring 生態圈,最讓人興奮的莫過於 Spring Boot 框架。或許從命名上就能看出這個框架的設計初衷:快速的啟動 Spring 應用。因而 Spring Boot 應用本質上就是一個基於 Spring 框架的應用,它是 Spring 對“約定優先於配置”理念的最佳實踐產物,它能夠

單例設計模式的幾種寫法(java版本、詳細

簡介 單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許一個例項存在。這篇部落格很精彩哦,請一定要耐心看完哦 在Java設計模式中,單例模式相對來說算是比較簡單的一種構建模式。適用的場景在於:對於定義的一個類,在整個應用程式執行期間只有唯一的一個例項物件。如Android中常見的

各大公司Java面試題詳細總結

各大公司Java面試題超詳細總結 ThreadLocal(執行緒變數副本) Synchronized實現記憶體共享,ThreadLocal為每個執行緒維護一個本地變數。 採用空間換時間,它用於執行緒間的資料隔離,為每一個使用該變數的執行緒提供一個副本,每個執行緒都可以獨立地改變自己的副本,而不會

詳細 Spring @RequestMapping 註解使用技巧

Request Mapping 基礎用法 在 Spring MVC 應用程式中,RequestDispatcher (在 Front Controller 之下) 這個 servlet 負責將進入的 HTTP 請求路由到控制器的處理方法。 在對 Spring MVC 進行的配

學科知識與能力美術《園林知識點彙總

園林知識點彙總 根據歷年教資考試彙總的考題來看,發現會有一些經常考到的知識點,所以中公講師特意為大家準備了關於園林部分知識點,希望能夠幫助大家更深入瞭解本節內容,直擊重點內容 一、中國古典園林 1.分類: 私家園林:蘇州獅子林、拙政園、網師園、留園等。 皇家園林

簡單選擇排序演算法原理及java實現(詳細

選擇排序是一種非常簡單的排序演算法,就是在序列中依次選擇最大(或者最小)的數,並將其放到待排序的數列的起始位置。 簡單選擇排序的原理 簡單選擇排序的原理非常簡單,即在待排序的數列中尋找最大(或者最小)的一個數,與第 1 個元素進行交換,接著在剩餘的待排序的數列中繼續找最大(最小)的一個數,與第 2 個元素交

給你一份詳細 Spring Boot 知識清單

在過去兩三年的Spring生態圈,最讓人興奮的莫過於Spring Boot框架。或許從命名上就能看出這個框架的設計初衷:快速的啟動Spring應用。因而Spring Boot應用本質上就是一個基於Spring框架的應用,它是Spring對“約定優先於配置”理念的最佳實踐產

centos 7安裝部署java jdk 8,設定java環境變數(詳細,其他linux系統也可通過該方法安裝java,配置java環境變數)

前置配置 作業系統:CentOS Linux release 7.5.1804 Java版本號:jdk1.8.0_191 #OS版本號查詢 [[email protected] ~]$ cat

Java面試題詳細總結

1:ThreadLocal(執行緒變數副本) Synchronized實現記憶體共享,ThreadLocal為每個執行緒維護一個本地變數。 採用空間換時間,它用於執行緒間的資料隔離,為每一個使用該變數的執行緒提供一個副本,每個執行緒都可以獨立地改變自己的副本,而

Java設計模式詳細

正好研究生開了這門課,叫做高階軟體設計。本人雖然瞭解c++,但是不熟,老師上課講的很深,java的設計模式比較熟,所以聽得很懂。同時呢,老師上課還講了C++的一些經典設計模式的實現(好吧,實際上是大部分),但是我這個時候基本神遊天外了。幸運的是,考試只考了java版本的,哈

react + redux 開發框架搭建 詳細

最近週末有時間,想把加入前端一來一年時間對於react以及redux的理解記錄下來,沒有什麼比一個產品更有說服力,在這裡搭建一個簡單的框架,供剛加入前端準備學習react的小白作為入門學習。 專案程式碼,稍後會有升級。 首先使用create-react-ap

詳細Spring入門講解

1.基本內容 spring是為了解決企業應用開發的複雜性而建立的,是一個輕量級的控制反轉(IoC)[指的是將物件的建立權反轉給Spring,作用是實現了程式的解耦合]和麵向切面(AOP)的容器框架。 並不侷限於某一層,是物件的容器,幫我們“管理”專

快速搭建java開發環境-詳細簡單(適用於window平臺)

1.安裝jdk oracle下載jdk,目前較新版本jdk1.8、1.9,本文安裝jdk1.8.0_131版本,安裝步驟省略(目錄做好不要帶空格,會很麻煩),當然如果你很ok的話,也可以下載zip檔案

【Maven+SSM】詳細Spring+SpringMVC+Redis整合

前言:        文章背景,最近專案中做了一個上傳圖片的功能,由於是流式上傳,所以閘道器層沒有對使用者許可權做過濾。需要自己手動做使用者許可權校驗。但是,如果每次上傳圖片都進行資料庫查詢會造成資料庫壓力大。因此,看前人程式碼中,用到了redis快取讀取。學習記錄之。   

演算法基礎(八)詳細最優二叉樹構建(1)

赫夫曼(Huffman)樹也稱最有二叉樹,是一類帶全路徑長度最短的樹,有著廣泛的應用。比如一棵判定樹,根據學生的成績劃分及格還是不及格還是優、中等、良好。顯然用if-else或者switch就可以簡單實現,當然可以直接毫不考慮的直接這樣寫,但是如果我們再肯花點功夫,就可以得