Spring基礎(chǔ)內(nèi)容
1.Spring是什么茁瘦?
- spring是一個分層的輕量級的全棧輕量級開源框架(全棧指的是各個層都有相應(yīng)的處理方案)弊知,以ioc和aop為內(nèi)核。提供了展現(xiàn)層springmvc和持久層spring jdbctemplate以及業(yè)務(wù)層事務(wù)管理等眾多企業(yè)級應(yīng)用技術(shù)逐样,還整合了開源世界中眾多的優(yōu)秀的第三方類庫,逐漸成為使用最多的javaee企業(yè)應(yīng)用開源框架盗迟。
2.spring的優(yōu)勢
方便解耦,簡化開發(fā)
AOP編程的支持
聲明式事務(wù)的支持
方便程序的測試
方便集成各種優(yōu)秀的框架
降低javaee api(jdbc熙含、Java mail 罚缕、遠(yuǎn)程調(diào)用)的使用難度
java源碼經(jīng)典學(xué)習(xí)典范
3.spring體系結(jié)構(gòu)
spring最下層是spring的核心容器包括四部分:beans,core怎静,context怕磨,spEl(spring express language)
4.spring快速入門
-
思考:之前不同的類之間調(diào)用通過創(chuàng)建實例對象的方式進(jìn)行調(diào)用,這樣就增加了程序間的耦合度消约,因此我們需要使用spring來解決這一問題,將所有的類都交由spring進(jìn)行管理员帮。
開發(fā)步驟
1.導(dǎo)入spring坐標(biāo)(spring-context)
2.編寫dao接口和實現(xiàn)類
3.創(chuàng)建spring核心配置文件(在resource中創(chuàng)建application-context.xml)
4.在spring的配置文件中配置實現(xiàn)類
<bean id="自己起的標(biāo)識類名" class="全限定類名"></bean></pre>
5.使用spring的api獲取Bean實例(ClassPathXmlApplicationContext加載xml文件之后使用getbean獲取bean對象調(diào)用方法即可)或粮。
ApplicationContext app=new ClassPathXmlApplicationContext("application-context.xml");
app.getBean("自己起的標(biāo)識類名");//此處就獲取到了bean對象</pre>
5.spring配置文件詳解
-
5.1bean標(biāo)簽的基本配置
用于配置對象交由spring來創(chuàng)建
默認(rèn)情況下他調(diào)用的類是無參構(gòu)造函數(shù),如果沒有無參構(gòu)造則創(chuàng)建不成功捞高。
-
基本屬性
id:bean實例在spring容器中的唯一標(biāo)識
class:bean的全限定類名
-
5.2bean標(biāo)簽的范圍配置
socpe:指對象的作用范圍氯材。
注意:singleton使用空參構(gòu)造進(jìn)行初始化且執(zhí)行一次(創(chuàng)建一次bean對象),prototype使用空參構(gòu)造進(jìn)行初始化硝岗,且執(zhí)行多次(每獲取一次bean對象創(chuàng)建一次bean)氢哮,不用時被gc回收。
-
取值范圍 說明 singleton 默認(rèn)型檀,單例 prototype 多例的(每次getbean都會創(chuàng)建一個新的對象) request web項目中冗尤,spring創(chuàng)建一個bean對象,將對象存入request域中 session web項目中胀溺,spring創(chuàng)建一個bean對象裂七,將對象存入session域中 global session web項目中,應(yīng)用portlet環(huán)境仓坞。如果沒有portlet環(huán)境背零,該范圍就相當(dāng)于session
-
5.3bean的生命周期配置
init-method:指類中的初始化方法名稱(在xml文件的bean中配置init-method對應(yīng)執(zhí)行的方法)
destroy-method:指類中銷毀方法名稱(在xml文件的bean中配置destory-method對應(yīng)執(zhí)行的方法)
bean的生命周期包括:初始化、創(chuàng)建无埃、銷毀
-
5.4bean實例化的三種方式
-
無參構(gòu)造方法實例化
-
無參構(gòu)造方式實例化步驟:
1.編寫dao接口和實現(xiàn)類
2.創(chuàng)建spring配置文件application-context.xml并配置bean
<bean id="唯一標(biāo)識名" class="全限定類名"></bean></pre>
3.在測試類中調(diào)用api接口加載配置文件徙瓶,獲取bean調(diào)用方法即可。
-
-
工廠靜態(tài)方法實例化
-
工廠靜態(tài)方法實例化步驟:
1.創(chuàng)建靜態(tài)工場類的靜態(tài)方法嫉称,返回實現(xiàn)類侦镇。
2.創(chuàng)建application-context.xml,定義bean在里面寫factory-method=“方法名”澎埠。
3.在測試類中調(diào)用ClassPathXmlApplicationContext加載spring的xml文件虽缕,之后getBean后,調(diào)用對應(yīng)的方法即可。
-
-
工廠實例方法實例化
-
工廠實例方法實例化步驟:
1.創(chuàng)建實例方法類和類中的方法氮趋,返回實現(xiàn)類伍派。
2.創(chuàng)建application-context.xml,定義bean在里面寫id和class剩胁,在定義一個bean在里面寫id诉植,factory-bean=“第一個bean的id名”、factory-method=“方法名”
3.在測試類中調(diào)用ClassPathXmlApplicationContext加載spring配置文件昵观,之后使用getBean獲取bean晾腔,在調(diào)用方法即可。
-
-
-
5.5spring的依賴注入
-
DI依賴注入:就是將一個容器設(shè)置到另一個容器內(nèi)部啊犬。
-
依賴注入的方式:
-
set注入:
在類中創(chuàng)建setxxx方法灼擂。
在bean雙標(biāo)簽中寫property屬性標(biāo)簽,設(shè)置name屬性(值:setxxx的set去掉)觉至、ref屬性(定義的另一個bean【即需要注入的那個容器】)
【set注入簡便方式:p命名空間注入】:1.在xml文件中賦值第一行加:p剔应。2.直接在被注入的那個bean標(biāo)簽中書寫屬性p:需要注入的bean的id名-ref=”需要注入的bean的id名“。
-
構(gòu)造注入:
在類中創(chuàng)建構(gòu)造方法(空參语御、有參構(gòu)造)
在bean雙標(biāo)簽中寫constructor-arg標(biāo)簽峻贮,在該標(biāo)簽中寫name=”參數(shù)名“、ref=”第一個bean的唯一標(biāo)識名“应闯。
-
-
依賴注入的三種數(shù)據(jù)類型:
-
普通數(shù)據(jù)類型
普通數(shù)據(jù)類型注入時纤控,使用property標(biāo)簽,在里面寫name=”屬性名“碉纺、value=”屬性值“船万。
引用數(shù)據(jù)類型
-
集合數(shù)據(jù)類型
1.list
在xml文件中的bean標(biāo)簽里寫property標(biāo)簽,在property標(biāo)簽里寫list標(biāo)簽惜辑,在list標(biāo)簽里面寫value標(biāo)簽【表示list里面的多個值】
<bean id="唯一標(biāo)識名" class="全限定類名">
<property>
<list>
<value></value>
<value></value>
...
</list>
</property>
</bean></pre>2.map
在xml文件中的bean標(biāo)簽中寫map標(biāo)簽唬涧,在map標(biāo)簽里面寫porperty里面再寫entry標(biāo)簽,entry標(biāo)簽寫屬性key=”自定義key“盛撑,value-ref=”bean標(biāo)簽的id“
<bean id="user1" class="全限定類名">
<property name="name" value="tom"/>
<property name="addr" value="beijing"/>
</bean>
<bean id="唯一標(biāo)識名" class="全限定類名">
<property>
<map>
<entry key="user1【這個是自定義的】" value-ref="user1【這個是上面的id標(biāo)識】"> </entry>
</map>
</property>
</bean></pre>##### 3.properties 在xml文件中的bean標(biāo)簽中寫property標(biāo)簽碎节,在property標(biāo)簽中寫name=“properties”,然后在property標(biāo)簽中寫props標(biāo)簽抵卫,在props標(biāo)簽中寫prop狮荔,在prop標(biāo)簽中寫屬性key=“自定義名稱”,在標(biāo)簽體間寫值即可
<bean id="唯一標(biāo)識" class="全限定類名">
<property name="properties">
<props>
<prop key="p1">111 </prop>
</props>
</property>
</bean></pre> -
-
6.spring引入其他配置文件(分模塊開發(fā))
spring配置內(nèi)容非常多時介粘,導(dǎo)致spring配置繁雜體積過大殖氏,所以要拆分到不同的配置文件中,而spring主配置文件通過import標(biāo)簽進(jìn)行加載姻采。
<import resource="applicationContext-xxx.xml"/></pre>
7.spring相關(guān)的api
ApplicationContext的實現(xiàn)類
1.ClassPathXmlApplicationContext:從類的根路徑下加載配置文件推薦使用
2.FileSystemXmlApplicationContext:從磁盤路徑加載配置文件
3.AnnotationConfigApplicationContext:使用注解配置容器對象時雅采,需要使用此類在創(chuàng)建spring容器,它用 來讀取注解。
getBean方法
1.傳入字符串參數(shù)(即傳入xml文件中的bean的id)來獲取bean
2.傳入字節(jié)碼對象類型(傳入接口類的class文件)
注:兩種方式的區(qū)別:第一種允許xml中的bean的class類重復(fù)婚瓜,因為它是通過id獲取的
第二種不允許xml中的bean重復(fù)宝鼓,因為它通過類的字節(jié)碼獲取,而bean的class寫的是 接口的實現(xiàn)類巴刻。
8.數(shù)據(jù)源配置
在測試類中讀取配置文件properties:
ResourceBundle.getBundle("配置文件名");
在xml文件中加載配置文件properties:
引入Spring的命名空間context愚铡,之后使用下面一句代碼即可:
<context:property-placeholder location="classpath:文件名.properties"/></pre>
最后在需要替換的地方使用${鍵名}替換即可。
9.spring的注解開發(fā)
注解開發(fā)主要就是為了簡化xml文件的配置繁瑣的問題胡陪。
原始注解
注解 | 說明 |
---|---|
@Component | 使用在類上用于實例化bean |
@Controller | 使用在web層用于實例化bean |
@Service | 使用在service層用于實例化bean |
@Repository | 用在dao層用于實例化bean |
@Autowired | 用在字段上用于更具類型注入 |
@Qualifier | 結(jié)合@Autowired一起使用用于根據(jù)名稱進(jìn)行依賴注入 |
@Resource | 相當(dāng)于@Autowired和@Qualifier沥寥,按名稱進(jìn)行注入 |
@Value | 注入普通屬性 |
@Scope | 標(biāo)注bean的作用范圍 |
@PostConstruct | 使用在方法上標(biāo)注該方法是bean的初始化方法 |
@PreDestroy | 使用在方法上標(biāo)注該方法是bean的銷毀方法 |
使用組件掃描注意事項
注:使用注解開發(fā)時,需要進(jìn)行在spring配置文件中配置組件掃描柠座,作用是指定哪個包及其子包下的bean需要進(jìn)行組件掃描以便識別使用注解配置的類邑雅、方法和字段。
如果沒有加這句注解掃描的配置妈经,就會報NoSuchBeanDefinationException
配置組件掃描代碼:
<context:component-scan base-package="包的全限定類名"></context:component-scan></pre>
注解的依賴注入(按名稱注入)
方式1:@Resource(name="xml文件的bean的id")
方式2:@Autowired @Qualifier("xml文件的bean的id")
@Value的使用
在xml文件中蒂阱,加載properties配置文件
<context:property-placeholder location="classpath:文件名.properties"/>
@value(${jdbc.driver})
private String driver;
10.spring的新注解
使用老注解并不能替換所有的xml配置文件,因此需要新注解狂塘。
非自定義的bean的配置<bean>
-
加載properties文件的配置:
<context:property-placeholder location:"classpath:文件名.properties"></pre>
組件掃描配置:
<context:component-scan base-package=""></pre>
-
引入其他文件
<import resource=""/></pre>
以上四條的xml配置的替換注解
注解 | 說明 |
---|---|
@Configuration | 用于指定當(dāng)前類是一個spring配置類,當(dāng)創(chuàng)建容器時會從該類上加載注解 |
@ComponentScan | 用于指定spring在初始化時要掃描的包鳄厌。作用和在spring的xml配置文件中的context:component-scan相同荞胡。 |
@Bean | 使用在方法上標(biāo)識該方法的返回值存儲到spring容器中 |
@PropertySource | 用于加載.properties文件中的配置 |
@Import | 用于導(dǎo)入其他配置類 |
使用注解零配置時,測試時需要使用AnnotationConfigApplicationContext(配置類的字節(jié)碼文件)進(jìn)行獲取配置了嚎,之后使用getBean(接口類的字節(jié)碼文件)進(jìn)行獲取bean即可泪漂。
11.spring集成junit
思考:為什么spring要集成junit呢?因為spring不集成junit的話歪泳,就需要在測試類中寫兩句話(讀取xml配置文件或者配置類萝勤,獲取springBean對象)來獲取容器。如果不寫就會報空指針異常呐伞。
junit負(fù)責(zé)創(chuàng)建spring容器敌卓,但是需要將配置文件的名稱告訴他,將進(jìn)行測試的bean直接在測試類中注入即可伶氢。
spring集成junit步驟
1.導(dǎo)入spring-test
2.使用@Runwith(SpringJunit4ClassRunner.class)注解替換原有的運行期
3.使用@ContextConfiguration指定配置文件(”classpath:文件名“)或配置類(classes={配置類字節(jié)碼文件})
4.使用@Autowired注入測試對象
5.創(chuàng)建測試方法進(jìn)行測試
12.spring的aop
什么是AOP(Aspect Oriented Programming)的縮寫趟径,通過預(yù)編譯方式和動態(tài)期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。
aop作用和優(yōu)勢:在程序運行期間癣防,在不修改源碼的情況下對方法進(jìn)行增強(qiáng)蜗巧。
aop優(yōu)勢:減少重復(fù)代碼,提高開發(fā)效率蕾盯,并便于維護(hù)
AOP底層就是spring動態(tài)代理實現(xiàn)的幕屹,動態(tài)代理包括Cglib(基于父類動態(tài)代理技術(shù))和JDKproxy(基于接口動態(tài)代理技術(shù))
基于JDKproxy的底層核心代碼
public class ProxyTest {
public static void main(String[] args) {
final Target target = new Target();//創(chuàng)建目標(biāo)類實現(xiàn)類
final Advice advice = new Advice();//創(chuàng)建增強(qiáng)類實現(xiàn)類
//返回父類接口,JDKproxy的代理類與目標(biāo)類實現(xiàn)同一個接口
TargetInterface proxyInstance = (TargetInterface) Proxy.newProxyInstance(
target.getClass().getClassLoader(),//類加載器
target.getClass().getInterfaces(),//接口的字節(jié)碼文件
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
advice.before();//前置增強(qiáng)
Object invoke = method.invoke(target, args);
advice.afterRunning();//后置增強(qiáng)
return invoke;
}
}
);
proxyInstance.save();
}
}</pre>
基于cglib的底層核心代碼
public class ProxyTest {
public static void main(final String[] args) {
final Target target = new Target();
final Advice advice = new Advice();
//創(chuàng)建增強(qiáng)
Enhancer enhancer = new Enhancer();
//設(shè)置父類(目標(biāo)類)
enhancer.setSuperclass(Target.class);
//設(shè)置增強(qiáng)器
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
advice.before();
Object invoke = method.invoke(target, args);
advice.afterRunning();
return invoke;
}
});
//創(chuàng)建代理對象
Target proxy = (Target) enhancer.create();
proxy.save();
}
}</pre>
aop的相關(guān)術(shù)語的概念
Target | 代理的目標(biāo)對象 |
---|---|
Proxy | 一個類被AOP織入增強(qiáng)后產(chǎn)生的代理類對象 |
joinpoint | 連接點就是目標(biāo)對象可以被增強(qiáng)的方法(多個方法) |
pointcut | 切入點就是目標(biāo)方法被增強(qiáng)的方法 |
advice | 通知/增強(qiáng)就是對目標(biāo)方法增加的內(nèi)容 |
aspect | 切面:就是切點+通知 |
weaving | 織入:就是把增強(qiáng)應(yīng)用到目標(biāo)對象來創(chuàng)建代理對象的過程 |
基于xml的aop開發(fā)
快速入門
1.導(dǎo)入aop坐標(biāo)【aspectjweaver】
2.創(chuàng)建目標(biāo)類和目標(biāo)接口(內(nèi)部有切點【即方法】)
3.創(chuàng)建切面類(內(nèi)部有增強(qiáng)方法)
4.將目標(biāo)類和切面類的創(chuàng)建權(quán)交給spring
5.在spring的xml配置文件中配置織入關(guān)系(聲明目標(biāo)類bean和通知類bean,引入aop命名空間然后織入)
<bean id="切入點唯一標(biāo)識" class="目標(biāo)類"></bean>
<bean id="通知的唯一標(biāo)識" class="通知類"></bean>
<aop:config>
<aop:aspect ref="通知的唯一標(biāo)識">
<aop:before method="通知類的方法名" pointcut="excution(public void 目標(biāo)類的全限定類名. 目標(biāo)類的方法名)"></aop:before>
</aop:aspect>
</aop:config>
?</pre>
6.測試
切點表達(dá)式
語法:execution(【修飾符】 返回值類型 包名.類名.方法名)
*代表任意
..代表任意參數(shù)個數(shù)望拖,任意個數(shù)</pre>
切點表達(dá)式的抽取
聲明切點表達(dá)式
<pointcut id="唯一標(biāo)識" expression="execution(* ..*(..))"></pointcut>
使用切點表達(dá)式
<aop:around method="around" point-ref="唯一標(biāo)識"></aop:around></pre>
通知類型
名稱 | 標(biāo)簽 |
---|---|
前置通知 | <aop:before> |
后置通知 | <aop:after-running> |
環(huán)繞通知(前置加后置) | <aop:around> |
異常拋出通知(有異常就通知) | <aop:throwing> |
最終通知(不管怎樣都會通知) | <aop:after> |
環(huán)繞通知方法聲明時需要傳遞一個參數(shù)(pjp):
public Object around(ProceedingJoinPoint pjp){
Object proceed=pjp.proceed();
return proceed;
}
基于aop的注解開發(fā)
快速入門
開發(fā)步驟:
1.創(chuàng)建目標(biāo)接口和目標(biāo)類
2.創(chuàng)建切面類(內(nèi)有增強(qiáng)方法) 加@Aspect 在增強(qiáng)方法中使用@通知類型(“切點表達(dá)式”)
3.將目標(biāo)類和切面類的創(chuàng)建權(quán)交給spring 加@Component
4.在切面類中使用織入關(guān)系
5.在配置文件中開啟組件掃描和自動代理
用注解方式時渺尘,開啟aop自動代理兩種方式:1.在配置類中加@EnableApectJAutoProxy
2.需要創(chuàng)建一個xml文件,聲明aop命名空間
<aop:Aspect-autoproxy/>
6.測試
注解的五種通知方式
除了異常通知不太一樣其他標(biāo)識基本相同:異常通知@AfterThrowing
抽取切點表達(dá)式
//定義切點表達(dá)式
@Pointcut("切點表達(dá)式")
public void 方法名(){}
//切點表達(dá)式使用
@通知類型("類名.定義的方法名")</pre>
13.spring jdbcTemplate基本使用
開發(fā)步驟
1.導(dǎo)入spring-jdbc(操作mysql)和spring-tx(管理事務(wù))
2.創(chuàng)建數(shù)據(jù)庫表和實體
3.創(chuàng)建jdbcTemplate對象
4.執(zhí)行數(shù)據(jù)庫操作
不使用spring時靠娱,耦合性較強(qiáng)
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUser("root");
dataSource.setPassword("password");
System.out.println(dataSource);
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);</pre>
使用spring時沧烈,可以解耦將容器的創(chuàng)建權(quán)交給spring
//c3p0連接池數(shù)據(jù)源,配置連接
<bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"></property>
<property name="user" value="root"></property>
<property name="password" value="password"></property>
</bean>
//引用jdbc模板像云,注入ds
<bean class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="ds">
</property>
</bean>
?
//在測試類中注入jdbcTemplate锌雀,可以從spring容器中獲取
@Autowaired
JDBCTemplate jdbctemplate;
//配置運行時環(huán)境
@RunWith(“SpringJUnit4ClassRunner.class”)
//加載配置
@ContextConfiguration(“classpath:配置文件”)</pre>
JDBCTemplate的增刪改查相關(guān)的api及參數(shù)
增刪改基本類似
//返回值為一個整形數(shù)迅诬,里面的參數(shù)arg就是來替換sql語句的腋逆?
jdbcTemplate.insert|delete|update;</pre>
查詢語句的API
//查詢所有的信息返回List集合
jdbcTemplate.query(sql,new BeanPropertyRowMapper<實體類>(實體類字節(jié)碼文件));
//查詢單條數(shù)據(jù)
//queryForObject里面的參數(shù)為:SQL語句、封裝實體侈贷、替換參數(shù)
User user = jdbcTemplate.queryForObject("select * from user where id=?", new BeanPropertyRowMapper<User>(User.class), "1");
//查詢總記錄數(shù)
Integer i = jdbcTemplate.queryForObject("select count(1) from user", Integer.class);</pre>
14.聲明式事務(wù)
什么是編程式惩歉?就是自己使用java的api寫代碼。
什么式聲明式俏蛮?就是以配置的方式進(jìn)行配置撑蚌。
編程式事務(wù)控制相關(guān)的對象
1.平臺事務(wù)管理器
platformTransactionManager接口是spring的事務(wù)管理器,它里面提供了我們常用的操作事務(wù)的方法搏屑。
方法 | 說明 |
---|---|
TransactionStatus getTransaction(TransactionDefination defination) | 獲取事務(wù)的狀態(tài)信息 |
void commit(TransactionStatus status) | 提交事務(wù) |
void rollback(TransactionStatus status) | 回滾事務(wù) |
2.TransactionDefinition是事務(wù)的定義信息對象争涌。
方法 | 說明 |
---|---|
int getInsolationLevel() | 獲取隔離級別 |
int getPropogationBehavior() | 獲取傳播行為 |
int getTimeout() | 獲取超時時間 |
Boolean idReadyOnly() | 是否只讀 |
(1)事務(wù)隔離級別
設(shè)置事務(wù)隔離級別可以解決臟讀、不可重復(fù)讀辣恋、幻(虛)讀的問題
ISOLATION_DEFAULT
ISOLATION_UNCOMMIT(都不能解決)
ISOLATION_COMMIT(解決臟讀)
ISOLATION_REPEATABLE-READ(可重復(fù)讀事務(wù):可以解決不可重復(fù)讀)
ISOLATION_SERIALIZABLE(解決幻讀亮垫,效率超低相當(dāng)于鎖表一般不用)
(2)事務(wù)傳播行為
REQUIRED:如果當(dāng)前沒有事務(wù),就創(chuàng)建新事務(wù)伟骨。如果有事務(wù)饮潦,加入到該事務(wù)中。
SUPPORTS:如果當(dāng)前有事務(wù)携狭,就使用當(dāng)前事務(wù)继蜡,如果當(dāng)前沒事務(wù),就以非事務(wù)方式運行逛腿。
MANDATORY:如果當(dāng)前有事務(wù)壹瘟,就使用當(dāng)前事務(wù)。如果當(dāng)前沒事務(wù)鳄逾,就拋出異常稻轨。
REQUIRS_NEW:新建事務(wù),如果當(dāng)前存在事務(wù)雕凹,就把當(dāng)前事務(wù)掛起殴俱。
NOT_SUPPORTED:以非事務(wù)的方式執(zhí)行操作政冻,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起线欲。
NEVER:以非事務(wù)的方式運行明场,如果當(dāng)前存在事務(wù),就拋出異常李丰。
NESTED:如果當(dāng)前存在事務(wù)苦锨,就嵌套在事務(wù)中執(zhí)行。如果沒有事務(wù)趴泌,則執(zhí)行REQUIRED類似的操作舟舒。
超時時間:默認(rèn)值為-1,沒有超時限制嗜憔。如果有秃励,以秒為單位進(jìn)行設(shè)置。
是否只讀:建議查詢時設(shè)為只讀吉捶。
3.TransactionStatus
TransactionStatus接口提供事務(wù)的具體的運行狀態(tài)夺鲜。
方法 | 說明 |
---|---|
boolean hasSavepoint() | 是否存儲回滾點 |
boolean isCompleted() | 事務(wù)是否完成 |
boolean isNewTransaction() | 是否是新事務(wù) |
boolean isRollback() | 事務(wù)是否回滾 |
聲明式事務(wù)控制【底層使用的是AOP】
什么是聲明式事務(wù)控制?Spring的聲明式事務(wù)控制就是采用聲明的方式處理事務(wù)呐舔”依【在xml進(jìn)行配置】
聲明式事務(wù)控制的優(yōu)點:1.事務(wù)管理不侵入開發(fā)的組件【事務(wù)管理是系統(tǒng)層面,不是邏輯業(yè)務(wù)的一部分】
2.在不需要事務(wù)時珊拼,不需要修改源碼榄审,只需要刪掉配置即可。
事務(wù)的xml配置
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="ds"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name=""/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution( com.itcast.service.impl.AccountServiceImpl.transfer(..))"></aop:advisor>
</aop:config></pre>
事務(wù)的注解配置
(1)在配置文件中聲明數(shù)據(jù)源事務(wù)管理器
(2)在切點方法上面加@Transactional注解在里面配置:隔離級別杆麸、傳播行為、超時時間浪感、是否只讀
@Transactional(isolation = Isolation.DEFAULT,propagation = Propagation.REQUIRED,timeout = -1,readOnly = false)
(3)在xml文件中配置事務(wù)注解掃描
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven></pre>