{"id":26226,"date":"2024-03-16T06:23:08","date_gmt":"2024-03-16T06:23:08","guid":{"rendered":"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/"},"modified":"2024-03-22T08:04:24","modified_gmt":"2024-03-22T08:04:24","slug":"using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/","title":{"rendered":"Using TransactionProxyFactoryBean to achieve declarative programming in Spring practice"},"content":{"rendered":"<p>The declarative transaction management is an important feature in the Spring framework, which allows developers to manage transactions through configuration without altering business code. One way to achieve this is by using the `TransactionProxyFactoryBean` class.<\/p>\n<p>The steps to implement declarative transactions using `TransactionProxyFactoryBean` are as follows:<\/p>\n<p>Configure the data source: First, you need to configure the data source in the Spring configuration file, for example, using the `DataSource` interface.<\/p>\n<p>2. Configure the transaction manager: Next, in the Spring configuration file, set up the transaction manager, such as using the `DataSourceTransactionManager` class. This class will be associated with the data source and will be responsible for managing transactions.<\/p>\n<p>3. Create a target object: Next, create a class as the target object, which includes the methods that need to be managed.<\/p>\n<p>4. Set up `TransactionProxyFactoryBean` in the Spring configuration file and configure the following properties.<\/p>\n<p>&#8211; `target`: indicate the target object.<\/p>\n<p>&#8211; Specify the transaction manager.<\/p>\n<p>&#8211; `transactionAttributes`: Specify the properties of the transaction, such as propagation behavior and isolation level.<\/p>\n<p>5. Utilize the object: Register the Bean defined by `TransactionProxyFactoryBean` in the Spring container and use this Bean as the target object in the code.<\/p>\n<p>In this way, Spring will automatically apply transaction management when calling methods of the target object, based on the transaction attributes.<\/p>\n<p>Please note that the above steps are only applicable for XML-based configuration. \u5982\u679c\u4f7f\u7528\u6ce8\u89e3\u6216Java\u914d\u7f6e\u65b9\u5f0f\uff0c\u5219\u9700\u8981\u7565\u5fae\u4e0d\u540c\u7684\u6b65\u9aa4\u3002<\/p>\n<p>Here is an example Spring configuration file demonstrating how to use `TransactionProxyFactoryBean` to implement declarative transactions.<\/p>\n<pre class=\"post-pre\">&lt;!--&nbsp;\u914d\u7f6e\u6570\u636e\u6e90&nbsp;--&gt;<p><\/p><p>&lt;bean&nbsp;id=\"dataSource\"&nbsp;class=\"org.apache.commons.dbcp.BasicDataSource\"&gt;<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;\u6570\u636e\u6e90\u914d\u7f6e&nbsp;--&gt;<\/p><p>&lt;\/bean&gt;<\/p><p>&lt;!--&nbsp;\u914d\u7f6e\u4e8b\u52a1\u7ba1\u7406\u5668&nbsp;--&gt;<\/p><p>&lt;bean&nbsp;id=\"transactionManager\"&nbsp;class=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"&gt;<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=\"dataSource\"&nbsp;ref=\"dataSource\"\/&gt;<\/p><p>&lt;\/bean&gt;<\/p><p>&lt;!--&nbsp;\u521b\u5efa\u76ee\u6807\u5bf9\u8c61&nbsp;--&gt;<\/p><p>&lt;bean&nbsp;id=\"userService\"&nbsp;class=\"com.example.UserService\"\/&gt;<\/p><p>&lt;!--&nbsp;\u914d\u7f6eTransactionProxyFactoryBean&nbsp;--&gt;<\/p><p>&lt;bean&nbsp;id=\"transactionProxy\"&nbsp;class=\"org.springframework.transaction.interceptor.<\/p><p>TransactionProxyFactoryBean\"&gt;<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=\"target\"&nbsp;ref=\"userService\"\/&gt;<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=\"transactionManager\"&nbsp;ref=\"transactionManager\"\/&gt;<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=\"transactionAttributes\"&gt;<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;props&gt;<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop&nbsp;key=\"*\"&gt;PROPAGATION_REQUIRED&lt;\/prop&gt;<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/props&gt;<\/p><p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/property&gt;<\/p><p>&lt;\/bean&gt;<\/p><\/pre>\n<p>Use the ?? operator in the code.<\/p>\n<pre class=\"post-pre\">ApplicationContext&nbsp;context&nbsp;=&nbsp;new&nbsp;ClassPathXmlApplicationContext(\"spring-config.xml\");<p><\/p><p>UserService&nbsp;userService&nbsp;=&nbsp;(UserService)&nbsp;context.getBean(\"transactionProxy\");<\/p><p>userService.doSomething();<\/p><\/pre>\n<p>By following the steps above, you can use `TransactionProxyFactoryBean` to achieve declarative transaction management. When calling methods on the `userService` object, transactions will be automatically applied and managed based on the configured transaction attributes.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The declarative transaction management is an important feature in the Spring framework, which allows developers to manage transactions through configuration without altering business code. One way to achieve this is by using the `TransactionProxyFactoryBean` class. The steps to implement declarative transactions using `TransactionProxyFactoryBean` are as follows: Configure the data source: First, you need to configure [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-26226","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Using TransactionProxyFactoryBean to achieve declarative programming in Spring practice - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using TransactionProxyFactoryBean to achieve declarative programming in Spring practice\" \/>\n<meta property=\"og:description\" content=\"The declarative transaction management is an important feature in the Spring framework, which allows developers to manage transactions through configuration without altering business code. One way to achieve this is by using the `TransactionProxyFactoryBean` class. The steps to implement declarative transactions using `TransactionProxyFactoryBean` are as follows: Configure the data source: First, you need to configure [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/SiliCloudGlobal\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-16T06:23:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-22T08:04:24+00:00\" \/>\n<meta name=\"author\" content=\"Jackson Davis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@SiliCloudGlobal\" \/>\n<meta name=\"twitter:site\" content=\"@SiliCloudGlobal\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jackson Davis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/\"},\"author\":{\"name\":\"Jackson Davis\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/55a10b8b0457c35884c25677889ad350\"},\"headline\":\"Using TransactionProxyFactoryBean to achieve declarative programming in Spring practice\",\"datePublished\":\"2024-03-16T06:23:08+00:00\",\"dateModified\":\"2024-03-22T08:04:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/\"},\"wordCount\":289,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/\",\"name\":\"Using TransactionProxyFactoryBean to achieve declarative programming in Spring practice - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\"},\"datePublished\":\"2024-03-16T06:23:08+00:00\",\"dateModified\":\"2024-03-22T08:04:24+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.silicloud.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using TransactionProxyFactoryBean to achieve declarative programming in Spring practice\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/blog\/\",\"name\":\"Silicon Cloud Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\",\"name\":\"Silicon Cloud Blog\",\"url\":\"https:\/\/www.silicloud.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png\",\"contentUrl\":\"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png\",\"width\":1024,\"height\":1024,\"caption\":\"Silicon Cloud Blog\"},\"image\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/SiliCloudGlobal\/\",\"https:\/\/twitter.com\/SiliCloudGlobal\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/55a10b8b0457c35884c25677889ad350\",\"name\":\"Jackson Davis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/2fdb47d6df1226e92380d96973782572a97b0675d098bb914410dec348eb5d29?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/2fdb47d6df1226e92380d96973782572a97b0675d098bb914410dec348eb5d29?s=96&d=mm&r=g\",\"caption\":\"Jackson Davis\"},\"url\":\"https:\/\/www.silicloud.com\/blog\/author\/jacksondavis\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Using TransactionProxyFactoryBean to achieve declarative programming in Spring practice - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/","og_locale":"en_US","og_type":"article","og_title":"Using TransactionProxyFactoryBean to achieve declarative programming in Spring practice","og_description":"The declarative transaction management is an important feature in the Spring framework, which allows developers to manage transactions through configuration without altering business code. One way to achieve this is by using the `TransactionProxyFactoryBean` class. The steps to implement declarative transactions using `TransactionProxyFactoryBean` are as follows: Configure the data source: First, you need to configure [&hellip;]","og_url":"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/","og_site_name":"Blog - Silicon Cloud","article_publisher":"https:\/\/www.facebook.com\/SiliCloudGlobal\/","article_published_time":"2024-03-16T06:23:08+00:00","article_modified_time":"2024-03-22T08:04:24+00:00","author":"Jackson Davis","twitter_card":"summary_large_image","twitter_creator":"@SiliCloudGlobal","twitter_site":"@SiliCloudGlobal","twitter_misc":{"Written by":"Jackson Davis","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/#article","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/"},"author":{"name":"Jackson Davis","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/55a10b8b0457c35884c25677889ad350"},"headline":"Using TransactionProxyFactoryBean to achieve declarative programming in Spring practice","datePublished":"2024-03-16T06:23:08+00:00","dateModified":"2024-03-22T08:04:24+00:00","mainEntityOfPage":{"@id":"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/"},"wordCount":289,"commentCount":0,"publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/","url":"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/","name":"Using TransactionProxyFactoryBean to achieve declarative programming in Spring practice - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/#website"},"datePublished":"2024-03-16T06:23:08+00:00","dateModified":"2024-03-22T08:04:24+00:00","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/blog\/using-transactionproxyfactorybean-to-achieve-declarative-programming-in-spring-practice\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.silicloud.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Using TransactionProxyFactoryBean to achieve declarative programming in Spring practice"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/blog\/#website","url":"https:\/\/www.silicloud.com\/blog\/","name":"Silicon Cloud Blog","description":"","publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.silicloud.com\/blog\/#organization","name":"Silicon Cloud Blog","url":"https:\/\/www.silicloud.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png","contentUrl":"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png","width":1024,"height":1024,"caption":"Silicon Cloud Blog"},"image":{"@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/SiliCloudGlobal\/","https:\/\/twitter.com\/SiliCloudGlobal"]},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/55a10b8b0457c35884c25677889ad350","name":"Jackson Davis","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/2fdb47d6df1226e92380d96973782572a97b0675d098bb914410dec348eb5d29?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2fdb47d6df1226e92380d96973782572a97b0675d098bb914410dec348eb5d29?s=96&d=mm&r=g","caption":"Jackson Davis"},"url":"https:\/\/www.silicloud.com\/blog\/author\/jacksondavis\/"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/26226","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/comments?post=26226"}],"version-history":[{"count":1,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/26226\/revisions"}],"predecessor-version":[{"id":60379,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/26226\/revisions\/60379"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/media?parent=26226"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/categories?post=26226"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/tags?post=26226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}