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:用於構建基於訊息的應用程式
它們的依賴關係
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
<?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以外還有其他幾個註解配置元件:
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就可以簡單實現,當然可以直接毫不考慮的直接這樣寫,但是如果我們再肯花點功夫,就可以得