spring基礎(chǔ)內(nèi)容

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)

image.png

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>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載昔头,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末影兽,一起剝皮案震驚了整個濱河市揭斧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌峻堰,老刑警劉巖讹开,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捐名,居然都是意外死亡旦万,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門镶蹋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來成艘,“玉大人赏半,你說我怎么就攤上這事∠剑” “怎么了断箫?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秋冰。 經(jīng)常有香客問我仲义,道長,這世上最難降的妖魔是什么剑勾? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任埃撵,我火速辦了婚禮,結(jié)果婚禮上甥材,老公的妹妹穿的比我還像新娘盯另。我一直安慰自己,他們只是感情好洲赵,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布鸳惯。 她就那樣靜靜地躺著,像睡著了一般叠萍。 火紅的嫁衣襯著肌膚如雪芝发。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天苛谷,我揣著相機(jī)與錄音辅鲸,去河邊找鬼。 笑死腹殿,一個胖子當(dāng)著我的面吹牛独悴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锣尉,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼刻炒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了自沧?” 一聲冷哼從身側(cè)響起坟奥,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拇厢,沒想到半個月后爱谁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡孝偎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年访敌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衣盾。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡捐顷,死狀恐怖荡陷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情迅涮,我是刑警寧澤废赞,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站叮姑,受9級特大地震影響唉地,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜传透,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一耘沼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧朱盐,春花似錦群嗤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至躯肌,卻和暖如春者春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背清女。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工钱烟, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嫡丙。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓拴袭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親曙博。 傳聞我的和親對象是個殘疾皇子拥刻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 參考W3C Spring教程 Spring致力于J2EE應(yīng)用的各種解決方案,而不僅僅專注于某一層解決方案羊瘩。可以說S...
    王偵閱讀 1,153評論 0 6
  • 1. 什么是Spring 框架盼砍? Spring 是一個開源應(yīng)用框架尘吗,旨在降低應(yīng)用程序開發(fā)的復(fù)雜度。它是輕量級浇坐、松散...
    Tim在路上閱讀 259評論 0 2
  • Spring理念 解決開發(fā)的復(fù)雜性睬捶,簡化開發(fā)。其本身是一個大雜燴近刘,整合了現(xiàn)有的流行技術(shù)框架擒贸。 導(dǎo)入依賴 Sprin...
    在error邊緣瘋狂試探閱讀 308評論 0 1
  • 1臀晃、談?wù)勀銓pring的理解? spring 是一個開源的輕量級 JavaBean 容器框架介劫。使用 JavaBe...
    執(zhí)著的逗比閱讀 274評論 0 2
  • 久違的晴天徽惋,家長會。 家長大會開好到教室時座韵,離放學(xué)已經(jīng)沒多少時間了险绘。班主任說已經(jīng)安排了三個家長分享經(jīng)驗。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,513評論 16 22