Rumah Java javaTutorial 详解五种Spring事务Transaction配置的注入方式

详解五种Spring事务Transaction配置的注入方式

May 02, 2017 am 11:37 AM
spring

这篇文章主要介绍了Spring事务Transaction配置的五种注入方式详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

前段时间对spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。

总结如下:

Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。

DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。

具体如下图:

根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:

第一种方式:每个Bean都有一个代理


<?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" 
 xmlns:aop="http://www.springframework.org/schema/aop" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 www.springframework.org/schema/beans/spring-beans-2.5.xsd 
 www.springframework.org/schema/context 
 www.springframework.org/schema/context/spring-context-2.5.xsd 
 www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> 
 
 <bean id="sessionFactory" 
 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
 <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 
 </bean> 
 
 <!-- 定义事务管理器(声明式的事务) --> 
 <bean id="transactionManager" 
 class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
 <property name="sessionFactory" ref="sessionFactory" /> 
 </bean> 
 
 <!-- 配置DAO --> 
 <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"> 
 <property name="sessionFactory" ref="sessionFactory" /> 
 </bean> 
 
 <bean id="userDao" 
 class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
 <!-- 配置事务管理器 --> 
 <property name="transactionManager" ref="transactionManager" /> 
 <property name="target" ref="userDaoTarget" /> 
 <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" /> 
 <!-- 配置事务属性 --> 
 <property name="transactionAttributes"> 
 <props> 
 <prop key="*"> PROPAGATION_REQUIRED </prop> 
 </props> 
 </property> 
 </bean> 
 </beans>
Salin selepas log masuk

第二种方式:所有Bean共享一个代理基类

<?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" 
 xmlns:aop="http://www.springframework.org/schema/aop" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 www.springframework.org/schema/beans/spring-beans-2.5.xsd 
 www.springframework.org/schema/context 
 www.springframework.org/schema/context/spring-context-2.5.xsd 
 www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> 
 
 <bean id="sessionFactory" 
 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
 <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 
 </bean> 
 
 <!-- 定义事务管理器(声明式的事务) --> 
 <bean id="transactionManager" 
 class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
 <property name="sessionFactory" ref="sessionFactory" /> 
 </bean> 
 
 <bean id="transactionBase" 
 class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
 lazy-init="true" abstract="true"> 
 <!-- 配置事务管理器 --> 
 <property name="transactionManager" ref="transactionManager" /> 
 <!-- 配置事务属性 --> 
 <property name="transactionAttributes"> 
 <props> 
 <prop key="*">PROPAGATION_REQUIRED </prop> 
 </props> 
 </property> 
 </bean> 
 
 <!-- 配置DAO --> 
 <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"> 
 <property name="sessionFactory" ref="sessionFactory" /> 
 </bean> 
 
 <bean id="userDao" parent="transactionBase"> 
 <property name="target" ref="userDaoTarget" /> 
 </bean> 
 </beans>
Salin selepas log masuk

第三种方式:使用拦截器

<?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" 
 xmlns:aop="http://www.springframework.org/schema/aop" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 www.springframework.org/schema/beans/spring-beans-2.5.xsd 
 www.springframework.org/schema/context 
 www.springframework.org/schema/context/spring-context-2.5.xsd 
 www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> 
 
 <bean id="sessionFactory" 
 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
 <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 
 </bean> 
 
 <!-- 定义事务管理器(声明式的事务) --> 
 <bean id="transactionManager" 
 class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
 <property name="sessionFactory" ref="sessionFactory" /> 
 </bean> 
 
 <bean id="transactionInterceptor" 
 class="org.springframework.transaction.interceptor.TransactionInterceptor"> 
 <property name="transactionManager" ref="transactionManager" /> 
 <!-- 配置事务属性 --> 
 <property name="transactionAttributes"> 
 <props> 
 <prop key="*">PROPAGATION_REQUIRED </prop> 
 </props> 
 </property> 
 </bean> 
 
 <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
 <property name="beanNames"> 
 <list> 
 <value> *Dao </value> 
 </list> 
 </property> 
 <property name="interceptorNames"> 
 <list> 
 <value> transactionInterceptor </value> 
 </list> 
 </property> 
 </bean> 
 
 <!-- 配置DAO --> 
 <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl"> 
 <property name="sessionFactory" ref="sessionFactory" /> 
 </bean> 
 </beans>
Salin selepas log masuk

第四种方式:使用tx标签配置的拦截器

<?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" 
 xmlns:aop="http://www.springframework.org/schema/aop" 
 xmlns:tx="http://www.springframework.org/schema/tx" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 www.springframework.org/schema/beans/spring-beans-2.5.xsd 
 www.springframework.org/schema/context 
 www.springframework.org/schema/context/spring-context-2.5.xsd 
 www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
 www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 
 
 <context:annotation-config /> 
 <context:component-scan base-package="com.bluesky" /> 
 
 <bean id="sessionFactory" 
 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
 <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
 <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> 
 </bean> 
 
 <!-- 定义事务管理器(声明式的事务) --> 
 <bean id="transactionManager" 
 class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
 <property name="sessionFactory" ref="sessionFactory" /> 
 </bean> 
 
 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
 <tx:attributes> 
 <tx:method name="*" propagation="REQUIRED" /> 
 </tx:attributes> 
 </tx:advice> 
 
 <aop:config> 
 <aop:pointcut id="interceptorPointCuts" 
 expression="execution(*com.bluesky.spring.dao.*.*(..))" /> 
 <aop:advisor advice-ref="txAdvice" 
 pointcut-ref="interceptorPointCuts" /> 
 </aop:config> 
 </beans>
Salin selepas log masuk

第五种方式:全注解

<?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"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
   www.springframework.org/schema/beans/spring-beans-2.5.xsd
   www.springframework.org/schema/context
   www.springframework.org/schema/context/spring-context-2.5.xsd
   www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
   www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

 <context:annotation-config />
 <context:component-scan base-package="com.bluesky" />

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

 <bean id="sessionFactory" 
   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
  <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
  <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
 </bean> 

 <!-- 定义事务管理器(声明式的事务) --> 
 <bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
 </bean>
</beans>
Salin selepas log masuk

此时在DAO上需加上@Transactional注解,如下:

package com.bluesky.spring.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;

import com.bluesky.spring.domain.User;

@Transactional
@Component("userDao")
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

 public List<User> listUsers() {
  return this.getSession().createQuery("from User").list();
 }  
}
Salin selepas log masuk

Atas ialah kandungan terperinci 详解五种Spring事务Transaction配置的注入方式. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Paradigma pengaturcaraan baharu, apabila Spring Boot bertemu OpenAI Paradigma pengaturcaraan baharu, apabila Spring Boot bertemu OpenAI Feb 01, 2024 pm 09:18 PM

Pada tahun 2023, teknologi AI telah menjadi topik hangat dan memberi impak besar kepada pelbagai industri, terutamanya dalam bidang pengaturcaraan. Orang ramai semakin menyedari kepentingan teknologi AI, dan komuniti Spring tidak terkecuali. Dengan kemajuan berterusan teknologi GenAI (General Artificial Intelligence), ia menjadi penting dan mendesak untuk memudahkan penciptaan aplikasi dengan fungsi AI. Dengan latar belakang ini, "SpringAI" muncul, bertujuan untuk memudahkan proses membangunkan aplikasi berfungsi AI, menjadikannya mudah dan intuitif serta mengelakkan kerumitan yang tidak perlu. Melalui "SpringAI", pembangun boleh membina aplikasi dengan lebih mudah dengan fungsi AI, menjadikannya lebih mudah untuk digunakan dan dikendalikan.

Gunakan Spring Boot dan Spring AI untuk membina aplikasi kecerdasan buatan generatif Gunakan Spring Boot dan Spring AI untuk membina aplikasi kecerdasan buatan generatif Apr 28, 2024 am 11:46 AM

Sebagai peneraju industri, Spring+AI menyediakan penyelesaian terkemuka untuk pelbagai industri melalui API yang berkuasa, fleksibel dan fungsi lanjutannya. Dalam topik ini, kami akan menyelidiki contoh aplikasi Spring+AI dalam pelbagai bidang Setiap kes akan menunjukkan cara Spring+AI memenuhi keperluan khusus, mencapai matlamat dan meluaskan LESSONSLEARNED ini kepada rangkaian aplikasi yang lebih luas. Saya harap topik ini dapat memberi inspirasi kepada anda untuk memahami dan menggunakan kemungkinan Spring+AI yang tidak terhingga dengan lebih mendalam. Rangka kerja Spring mempunyai sejarah lebih daripada 20 tahun dalam bidang pembangunan perisian, dan sudah 10 tahun sejak versi Spring Boot 1.0 dikeluarkan. Sekarang, tiada siapa boleh mempertikaikan Spring itu

Apakah kaedah pelaksanaan transaksi program musim bunga? Apakah kaedah pelaksanaan transaksi program musim bunga? Jan 08, 2024 am 10:23 AM

Cara melaksanakan transaksi terprogram musim bunga: 1. Gunakan TransactionTemplate 2. Gunakan TransactionCallback dan TransactionCallbackWithoutResult 3. Gunakan anotasi Transaksional;

Bagaimana untuk melaksanakan tugas berjadual dalam Java Spring Bagaimana untuk melaksanakan tugas berjadual dalam Java Spring May 24, 2023 pm 01:28 PM

Java melaksanakan tugas berjadual Dalam perpustakaan yang disertakan dengan Jdk, terdapat dua cara untuk melaksanakan tugas berjadual, satu ialah Pemasa dan satu lagi ialah ScheduledThreadPoolExecutor. Apabila Timer+TimerTask mencipta Timer, ia mencipta benang, yang boleh digunakan untuk menjadualkan tugas TimerTask mempunyai empat kaedah pembinaan dan anda boleh menentukan nama benang Timer dan sama ada untuk menetapkannya sebagai benang daemon. Nama lalai ialah Nombor-Pemasa, dan lalainya bukanlah benang daemon. Terdapat tiga kaedah utama: cancel(): tamatkan penjadualan tugas, batalkan semua tugasan yang dijadualkan pada masa ini, menjalankan tugas tidak akan terjejas purge(): alih keluar tugas daripada baris gilir tugas

Perbezaan dan hubungan antara Spring Boot dan Spring Cloud Perbezaan dan hubungan antara Spring Boot dan Spring Cloud Jun 22, 2023 pm 06:25 PM

SpringBoot dan SpringCloud ialah kedua-dua sambungan Rangka Kerja Spring yang membantu pembangun membina dan menggunakan aplikasi perkhidmatan mikro dengan lebih pantas, tetapi kedua-duanya mempunyai tujuan dan fungsi yang berbeza. SpringBoot ialah rangka kerja untuk membina aplikasi Java dengan pantas, membolehkan pembangun mencipta dan menggunakan aplikasi berasaskan Spring dengan lebih pantas. Ia menyediakan cara yang mudah dan mudah difahami untuk membina aplikasi Spring yang berdiri sendiri dan boleh dilaksanakan

7 anotasi yang paling biasa digunakan dalam Spring, organisasi paling berkuasa dalam sejarah! 7 anotasi yang paling biasa digunakan dalam Spring, organisasi paling berkuasa dalam sejarah! Jul 26, 2023 pm 04:38 PM

Dengan kemas kini dan lelaran teknologi, Java5.0 mula menyokong anotasi. Sebagai rangka kerja terkemuka di Java, spring perlahan-lahan mula meninggalkan konfigurasi xml sejak ia dikemas kini kepada versi 2.5, dan lebih banyak anotasi digunakan untuk mengawal rangka kerja spring.

Belajar Awan Musim Bunga dari awal Belajar Awan Musim Bunga dari awal Jun 22, 2023 am 08:11 AM

Sebagai pembangun Java, mempelajari dan menggunakan rangka kerja Spring adalah kemahiran penting. Dengan populariti pengkomputeran awan dan perkhidmatan mikro, pembelajaran dan menggunakan Spring Cloud telah menjadi satu lagi kemahiran yang mesti dikuasai. SpringCloud ialah set alat pembangunan berdasarkan SpringBoot untuk membina sistem teragih dengan cepat. Ia menyediakan pembangun dengan satu siri komponen, termasuk pendaftaran dan penemuan perkhidmatan, pusat konfigurasi, pengimbangan beban dan pemutus litar, dsb., yang membolehkan pembangun membina mikro

Cara menetapkan tahap pengasingan transaksi dalam Spring Cara menetapkan tahap pengasingan transaksi dalam Spring Jan 26, 2024 pm 05:38 PM

Cara menetapkan tahap pengasingan transaksi dalam Spring: 1. Gunakan anotasi @Transactional 2. Tetapkan dalam fail konfigurasi Spring 3. Gunakan PlatformTransactionManager 4. Tetapkan dalam kelas konfigurasi Java. Pengenalan terperinci: 1. Gunakan anotasi @Transactional, tambah anotasi @Transactional pada kelas atau kaedah yang memerlukan pengurusan transaksi dan tetapkan tahap pengasingan dalam atribut 2. Dalam fail konfigurasi Spring, dsb.

See all articles