1. 程式人生 > >Atitit spring註解事務的demo與程式碼說明 目錄 1.1. Spring框架中,要如何實現事務?有一個註解,@EnableTransactionManagement 1 1.2. 事務管理

Atitit spring註解事務的demo與程式碼說明 目錄 1.1. Spring框架中,要如何實現事務?有一個註解,@EnableTransactionManagement 1 1.2. 事務管理

Atitit spring註解事務的demo與程式碼說明

目錄

1.1. Spring框架中,要如何實現事務?有一個註解,@EnableTransactionManagement 1

1.2. 事務管理  99.99999%都是使用了xml來配置的 1

1.3. 開啟事務註解驅動@EnableTransactionManagement 2

1.4. 開啟aop  @EnableAspectJAutoProxy------- 3

1.5. 配置事務管理器 AppConfig 3

1.6. 配置資料來源/AtiDateSource.java 4

1.7. Userservice 和uesrdao 4

1.8. 呼叫spring4demoApplication 5

2. Other 6

2.1. @Transactional所需要的jar包 6

2.2. 二、使用@Transactional 7

3. Ref 8

 

    1. Spring框架中,要如何實現事務?有一個註解,@EnableTransactionManagement

傳統Spring框架的事務配置都是在XML配置檔案中配置的,指定資料來源,事務管理器,切入點等等。

那在零配置下的Spring框架中,要如何實現事務?有一個註解,@EnableTransactionManagement,這個註解能實現對標識了@Transactional註解的類或者方法環繞事務。

---------------------

 

    1. 事務管理  99.99999%都是使用了xml來配置的

但由於Spring4實戰裡並沒有講有關事務管理這方面的內容,而網上的教程99.99999%都是使用了xml來配置的,但由於個人更傾向於完全基於Java的配置,所以只能自己想辦法解決。 

      

 

<!-- 事務管理器,對mybatis操作資料庫進行事務控制,spring使用jdbc的事務控制類  -->

 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

 

<property name="dataSource" ref="dataSourceSuport"></property>

 

</bean>

 

   

 

<!—開啟spring 事務註解支援  mode="aspectj"表示採用切面    mode="proxy"表示代理模式(預設) -->

 

     <tx:annotation-driven transaction-manager="transactionManager"  />  

 

MyBatis自動參與到spring事務管理中,無需額外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的資料來源與DataSourceTransactionManager引用的資料來源一致即可,否則事務管理會不起作用。

 

@Transactional可以作用於介面、介面方法、類以及類方法上。當作用於類上時,該類的所有 public 方法將都具有該型別的事務屬性,同時,我們也可以在方法級別使用該標註來覆蓋類級別的定義。 雖然@Transactional 註解可以作用於介面、介面方法、類以及類方法上,但是 Spring 建議不要在介面或者介面方法上使用該註解,因為這隻有在使用基於介面的代理時它才會生效。另外,@Transactional 註解應該只被應用到public 方法上,這是由 Spring AOP 的本質決定的。如果你在 protected、private 或者預設可見性的方法上使用@Transactional 註解,這將被忽略,也不會丟擲任何異常。預設情況下,只有來自外部的方法呼叫才會被AOP代理捕獲,也就是,類內部方法呼叫本類內部的其他方法並不會引起事務行為,即使被呼叫方法使用@Transactional註解進行修飾。

---------------------

 

 

零配置下的Spring框架中,要如何實現事務?有一個註解,@EnableTransactionManagement,這個註解能實現對標識了@Transactional註解的類或者方法環繞事務。但是我們使用事務配置的最好的方式是不希望對業務程式碼上新增額外的東西,或者說事務的相關程式碼不要和業務的程式碼有所關聯,所以使用@EnableTransactionManagement註解的形式也不可取。

 

 

 

 

 

    1. 開啟事務註解驅動@EnableTransactionManagement

 

<!-- 事務註解驅動,標註@Transactional的類和方法將具有事務性 -->  

<tx:annotation-driven transaction-manager="txManager" />  

1

2

但有沒有方法可以代替這句話,我找了很久,終於發現在知乎中也有相關問題tx:annotation-driven用什麼註解代替

---------------------

用@EnableTransactionManagement來 啟用註解式事務管理,其效果等同於上面的xml配置中的< tx:annotation-driven/>,但此時還不能起效果,因為

還要找個東西來代替transaction-manager屬性,官方文件也給出瞭解決方法,就是讓配置類實現TransactionManagementConfigurer介面,它會覆蓋一個方法,(return那句是我自己加的)

 

@Override

    public PlatformTransactionManager annotationDrivenTransactionManager() {

        return new DataSourceTransactionManager(dataSource());

    }

 

    1. 開啟aop  @EnableAspectJAutoProxy------- 
    2. 配置事務管理器 AppConfig 

 

package iocSpring5demo;

 

import javax.sql.DataSource;

 

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.EnableAspectJAutoProxy;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import org.springframework.transaction.PlatformTransactionManager;

import org.springframework.transaction.annotation.TransactionManagementConfigurer;

 

@EnableAspectJAutoProxy

@Configuration /** 該註解表示這個類是一個Spring的配置類 **/

@ComponentScan(basePackages = {

"iocSpring5demo" }) /***

 * 該註解表示啟用spring的元件掃描功能,並且配置了掃描包net.xqlee.project.

 * demo下的所有類

 **/

public class AppConfig implements TransactionManagementConfigurer {

 

 

 

@Bean

public JdbcTemplate jdbcTemplate() {

return new JdbcTemplate(dataSource());

}

 

@Bean

public DataSource dataSource() {

AtiDateSource instance = new AtiDateSource();

return instance;

// configure and return the necessary JDBC DataSource

}

 

// @Bean

// public PlatformTransactionManager txManager() {

// return new DataSourceTransactionManager(dataSource());

// }

 

@Override

public PlatformTransactionManager annotationDrivenTransactionManager() {

return  new  DataSourceTransactionManager(dataSource());

}

    1. 配置資料來源/AtiDateSource.java

/iocSpring52Prj/src/iocSpring5demo/AtiDateSource.java

 

    1. Userservice 和uesrdao

package iocSpring5demo;

 

import javax.annotation.Resource;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.stereotype.Component;

import org.springframework.transaction.annotation.EnableTransactionManagement;

import org.springframework.transaction.annotation.Transactional;

import org.springframework.transaction.support.TransactionTemplate;

 

@Component /** 註冊為spring的元件bean **/

@EnableTransactionManagement

@Transactional

public class UserService {

 

@Autowired

public JdbcTemplate template;

 

@Autowired

public userDao userDao1;

// @Autowired

// TransactionTemplate transactionTemplate;

 

@Transactional

public String addUser(String name) {

 

 

userDao1.addUser1(name+"_bydataService1_adduser1" );

userDao1. addUser2(name+"_bydataService1_adduse2" );

return null;

}

 

 

// public String addUser1(String string) {

//   String sql="insert  user(name)values('@u@')  ";

//   sql=sql.replaceAll("@u@", string);

//   int r=      template.update(sql);

// return "hhh";

// }

//

// public void addUser2(String string) {

//   String sql="insert  user(name)values('@u@')  a";

//   sql=sql.replaceAll("@u@", string);

//   int r=      template.update(sql);

//

// }

}

 

    1. 呼叫spring4demoApplication

 

import org.springframework.context.annotation.Bean;

 

/**

 * spring 5程式啟動類

 *

 * @author xqlee

 *

 */

public class spring4demoApplication {

/** spring 依賴注入使用者測試類 **/

 

public static void main(String[] args) {

 

// com.mysql.jdbc.Driver

 

// org.springframework.transaction.PlatformTransactionManager

// 建立spring 基於註解配置的容器

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

// 獲取通過註解注入容器的UserService

UserService userService = context.getBean(UserService.class);

// 呼叫userService的方法執行

String message = userService.addUser("Leftso");

 

// userService.addUser("user2");

// 輸出結果

System.out.println(message);

// 關閉容器,釋放JVM資源

context.close();

}

 

   

}

  1. Other
    1. @Transactional所需要的jar包

1、aopalliance.jar  這個包是AOP聯盟的API包,裡面包含了針對面向切面的介面。(通常Spring等其它具備動態織入功能的框架依賴此包)

2、aspectjrt.jar     處理事務和AOP所需的包

3、aspectjweaver.jar        處理事務和AOP所需的包

4、cglib-nodep.jar     spring中自動代理所需jar包

 

 

    1. 二、使用@Transactional

1、@Transactional可以在service類或方法前加上@Transactional,在service類上宣告@Transactional,service所有方法需要事務管理。每一個業務方法開始時都會開啟一個事務。

 

 

問題

 No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager

 

You can use:

@Transactional("transactionManagerName")

 

  1. Ref

Spring零配置下的事務實現 - JJB的部落格 - CSDN部落格.html

 零xml配置Spring事務管理 - dgeek的部落格 - CSDN部落格.html

Spring詳解(八)------事務管理 - YSOcean - 部落格園.html