Spring纯注解的声明式事务配置

从零搭建A股量化交易系统:开源框架选型与实战部署指南 本文详细介绍了从零搭建A股量化交易系统的完整流程,重点分析了开源框架VNPY和QMT的选型与实战部署。内容涵盖系统架构设计、策略开发、性能优化及实盘过渡方案,为开发者提供了一套完整的A股实盘量化交易解决方案,助力高效构建稳定可靠的量化交易系统。 阅读详情

1.jdbcConfig.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123

2.config.JdbcConfig

package config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;


/**
 * 和连接数据库相关的配置类
 */
public class JdbcConfig {

    @Value("${jdbc.driver}")
    private String driver;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    /**
     * 创建jdbcTemplate对象
     * @param dataSource
     * @return
     */
    @Bean(name = "jdbcTemplate")
    public JdbcTemplate createJdbcTemplate(DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }

    /**
     * 创建数据源对象
     * @return
     */
    @Bean(name = "dataSource")
    public DataSource createDataSource(){
        DriverManagerDataSource ds = new DriverManagerDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return ds;
    }

}

3.config.SpringConfiguration

package config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * spring的配置类,相当于bean.xml
 */

@Configuration
@ComponentScan(basePackages = "com")
@Import({JdbcConfig.class,TransactionManager.class})
@PropertySource("classpath:jdbcConfig.properties")
@EnableTransactionManagement//开启声明式事务控制
public class SpringConfiguration {
}

4 config.TransactionManager

package config;

import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

/**
 * 和事务相关的配置类
 */
public class TransactionManager {


    /**
     * 用于创建事务管理对象
     * @param dataSource
     * @return
     */
    @Bean(name = "transactionManager")
    public PlatformTransactionManager createTransactionManager(DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

}

5.com.service.IAccountService

package com.service;

import com.domain.Account;

/**
 * 账户的业务层接口
 */
public interface IAccountService {
    /**
     * 根据id查询账户信息
     * @param id
     * @return
     */
    Account findAccountById(Integer id);

    /**
     * 转账
     * @param sourceName 转出账户名称
     * @param targetName 转入账户名称
     * @param money
     */
    void transfer(String sourceName, String targetName, Float money);
}

6.com.service.impl.AccountServiceImpl

package com.service.impl;

import com.dao.IAccountDao;
import com.domain.Account;
import com.service.IAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * 事务控制应该都是在业务层
 */
@Service
@Transactional(propagation = Propagation.REQUIRED,readOnly = true)
public class AccountServiceImpl implements IAccountService{

    @Autowired
    private IAccountDao accountDao;

    public Account findAccountById(Integer id) {
        return accountDao.findAccountById(id);
    }


    @Transactional(propagation = Propagation.REQUIRED,readOnly = false)
    public void transfer(String sourceName, String targetName, Float money) {

        System.out.println("transfer开始执行");
        //①.根据名称查询转出账户
        Account source = accountDao.findAccountByName(sourceName);
        //②.根据名称查询转入账户
        Account target = accountDao.findAccountByName(targetName);
        //③.转出账户减钱
        source.setMoney(source.getMoney()-money);
        //④.转入账户加钱
        target.setMoney(target.getMoney()+money);
        //⑤.更新转出账户
        accountDao.updateAccount(source);
//        int i = 1/0;
        //⑥.更新转入账户
        accountDao.updateAccount(target);

    }
}

7.com.dao.IAccountDao

package com.dao;

import com.domain.Account;

/**
 * 账户的持久层接口
 */
public interface IAccountDao {
    /**
     * 根据id查询账户
     * @param id
     * @return
     */
    Account findAccountById(Integer id);

    /**
     * 根据名称查询账户
     * @param name
     * @return
     */
    Account findAccountByName(String name);

    /**
     * 更新账户
     * @param account
     */
    void updateAccount(Account account);
}

8.com.dao.impl.AccountDaoImpl

package com.dao.impl;

import com.dao.IAccountDao;
import com.domain.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 账户的持久层实现类
 */
@Repository
public class AccountDaoImpl  implements IAccountDao{

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public Account findAccountById(Integer id) {
        List<Account> accounts = jdbcTemplate.query("select * from account where id=?", new BeanPropertyRowMapper<Account>(Account.class), id);
        return accounts.isEmpty()?null:accounts.get(0);
    }

    public Account findAccountByName(String name) {
        List<Account> accounts = jdbcTemplate.query("select * from account where name=?", new BeanPropertyRowMapper<Account>(Account.class), name);
        if(accounts.isEmpty()){
            return null;
        }
        if(accounts.size()>1){
            throw new RuntimeException("结果集不唯一");
        }
        return accounts.get(0);
    }

    public void updateAccount(Account account) {
        jdbcTemplate.update("update account set name=?,money=? where id=?",account.getName(),account.getMoney(),account.getId());

    }
}

9.com.domain.Account

package com.domain;

import java.io.Serializable;

/**
 * 账户的实体类
 */
public class Account implements Serializable{
    private Integer id;
    private String name;
    private Float money;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Float getMoney() {
        return money;
    }

    public void setMoney(Float money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

OpenHarmony 4.1/5.0 Beta上手:如何用ArkUI在非华为设备上开发你的第一个“鸿蒙”应用 本文详细介绍了如何在非华为设备上使用ArkUI开发OpenHarmony应用,涵盖从设备选型、环境搭建到应用部署的全流程。通过实战案例展示ArkTS语言在开源鸿蒙生态中的应用,帮助开发者突破设备限制,构建跨平台鸿蒙应用。 阅读详情

相关推荐

SAP-MM-PR分配货源并转PO

SAP-MM-PR分配货源并转PO

yanzibing99的博客 5473

Spring声明式事务基于xml/注解/纯注解的配置

xml配置声明式事务: 配置事物管理器 DataSourceTransactionManager 注入DataSource 配置事物的通知(增强的类是谁): &lt;tx:advice id=“通知的标识” transaction-manager=“通知是谁”&gt; 配置aop ,建立切入点表达式(哪些方法增强)和事物通知的关系 aop:config中aop:pointcut &amp;&...

UTFLLLLy的博客 722

UE4免费资产库新玩法:Quixel Bridge插件安装与Megascans资源导入全攻略

本文详细介绍了如何在UE4中安装Quixel Bridge插件并导入Megascans资源,帮助开发者快速获取高质量3D资产。通过分步教程和实用技巧,提升游戏或影视场景的制作效率,特别适合需要真实感环境的项目。

weixin_27729671的博客 364

spring中基于纯注解的声明式事务控制配置步骤

总配置类SpringConfiguration: /** * spring的配置类,相当于bean.xml */ @Configuration @ComponentScan("net.togogo") @Import({JdbcConfig.class,TransactionConfig.class}) @PropertySource("classpath:jdbcConfig.propert...

weixin_41605945的博客 229

超酷炫,Python实现交通数据可视化!

此时输出的栅格化参数params的内容存储了栅格坐标系的原点坐标(slon、slat)、单个栅格的经纬度长宽 (deltalon、deltalat)、栅格的旋转角度(theta)、栅格的形状(method参数,其值可以是方形rect、三角形tri和六边形hexa)以及栅格的大小(gridsize参数,单位为米)。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。今天分享一次Python交通数据分析与可视化的实战!

m0_59236127的博客 1696

java 二维码生成及其标签打印

本文主要内容 二维码生成 二维码标签预览及打印 二维码生成 笔者此次的二维码是通过调用第三方接口生成的,具体流程如下: 根据规范要求调用第三方接口,返回二维码下载地址及二维码图片的属性值(图片大小等) 根据返回的值获取二维码下载地址,根据地址下载二维码图片,保存至本地磁盘及记录数据信息 扫描二维码跳转相应地址,显示资产的基本信息 最终生成的二维码如下图所示: 预览并批量打印二维码标签 先...

孙小牟的博客 4941

spring第四天纯注解的声明式事务配置

1.所需jar包 业务层接口及实现类 com.pro.service.IAcountService package com.pro.service; import com.pro.domain.Acount; //账户的业务实现层 public interface IAcountService { //根据地查询账户 信息 Acount findByAcount...

qq_38125626的博客 219

ESP32-S3打造离线语音助手:从零部署自定义唤醒词与本地大模型推理【实战指南】

本文详细介绍了如何利用ESP32-S3芯片打造离线语音助手,包括自定义唤醒词训练与本地大模型推理的实战指南。通过硬件架构解析、音频处理优化及性能调优技巧,实现低延迟、高隐私保护的语音交互方案,特别适合智能家居和物联网应用。

weixin_30296405的博客 604

spring使用纯注解配置声明式事务(19)

目录 一.创建主配置类 二.编写和数据库相关的配置类 三.创建jdbcConfig.properties并写入数据库连接信息 四.编写和事务相关的配置类 五.其他事务类型的声明按照以下博客来,将重复作用的bean.xml注解忽略即可 一.创建主配置类 二.编写和数据库相关的配置类 三.创建jdbcConfig.properties并写入数据库连接信息 四.编写和...

qq_32865713的博客 287

YOLO26涨点改进 |独家创新,小目标涨点改进篇 | Arxiv 2025 | MHAF‑YOLO,引入RepHMS高效特征提取模块,适合轻量级目标检测、小目标检测、图像分类、旋转目标检测、实例分割

本文提出了一种改进的YOLO26目标检测模型,通过引入RepHMS模块和多分支辅助特征金字塔结构(MAFPN),显著提升了模型性能。RepHMS模块采用多分支异构卷积和重参数化策略,在不增加推理开销的情况下增强多尺度特征提取能力,尤其提升了小目标检测效果。实验表明,改进后的MHAF-YOLO模型在COCO数据集上仅用7.1M参数就达到48.9% AP,相比YOLO11-s参数量减少24.4%而性能提升1.9%。文章详细介绍了RepHMS模块的原理、实现代码及在YOLO26中的集成方法,并提供了两种改进配置。

Ai缝合怪、助力小伙伴高效发论文 199

【示波器专题】无源探头的常用附件

使用探头进行测试,我们不仅要知道探头的原理,还需要了解探头的常用附件及其使用方式,这样才能在尽可能在测试中提高效率且减少出错的概率

一点硬件 692

spring基于纯注解的声明式事务管理配置一遍文章带你快速了解

首先创建一个spring的配置类相当于bean.xml package com.lwh.config; import org.springframework.context.annotation.*; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @ComponentScan("com.lwh") @Import({JdbcConfig.class,Transac

java_cch的博客 159

S7-1200 PN与G120变频器控制起停及调速PROFINET实现详解

S7-1200 PLC与G120变频器通过PROFINET通信可实现高效、实时的电机控制。2. 《S7-1200与G120 CU250S-2PN的PROFINET通讯指南》- 控制器:S7-1200 PLC (如1214C DC/DC/DC)- 变频器:G120 CU250S-2PN (带PROFINET接口)- 输出区(PZD1-2):控制字(16位)、速度设定值(16位)- 输入区(PZD1-2):状态字(16位)、实际速度值(16位)- P922=1:选择报文类型为"标准报文1 (PZD2/2)"

电工 1866

【Spring框架】十五、Spring 基于纯注解配置的声明式事务控制

文章目录工程目录pom.xml账户实体类domain:Account业务层ServiceIAccountServiceAccountServiceImpl持久层AccountDaoIAccountDaoAccountDaoImplconfig包SpringConfigurationJdbcConfigjdbc.propertiesTransactionConfig测试类 工程目录 pom.xml...

Java 161

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

Spring事务配置可通过三种方式实现:纯XML配置、XML+注解混合、纯注解方式。在纯XML配置中,通过引入 spring-context、spring-jdbc、spring-tx 等依赖,并结合 <tx:advice> 和 <aop:advisor> 标签完成事务增强配置,常用于老项目中。XML+注解方式则在XML中配置事务管理器并开启注解支持,通过 @Transactional 注解在业务方法中灵活控制事务行为。纯注解方式则完全摆脱XML,利用 @EnableTransactionManagemen

谢谢你的喜欢 我们一起无限进步 778

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Spring第14篇_Spring中的事务控制

文章目录1. Spring中事务控制的API介绍1.1 PlatformTransactionManager2. Spring事务控制的代码准备3. Spring基于XML的声明式事务控制4.Spring基于注解的声明式事务控制5.Spring基于纯注解的声明式事务控制6. Spring5的新特性 1. Spring中事务控制的API介绍 1.1 PlatformTransactionManager ​ PlatformTransactionManager接口是Spring的事务管理器,它里面提供了常用的操

weixin_44086832的博客 313

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[特殊字符] 一文搞懂 Spring 框架事务管理(含XML、注解、纯注解三种方式)

在开发中,“事务”这个词出现得非常频繁。事务(Transaction)是一组操作的集合,要么全部成功,要么全部失败。举个例子:假设你在转账,A账户转100元给B账户。这个过程有两个操作:A账户减100B账户加100这两个操作必须要么都执行,要么都不执行。如果执行到一半程序崩了,只扣了A的钱没加给B,那就出大问题了!这时候,事务管理就上场了。它能保证在异常出现时自动回滚(rollback),让数据保持一致。

m0_62724751的博客 639

Spring框架的事务管理

XML 配置方式:适合于对配置细节有严格要求,且团队对 XML 配置比较熟悉的场景。通过 XML 可以清晰地定义事务的各个方面,但配置文件可能会变得冗长和复杂。XML + 注解方式:结合了 XML 配置的灵活性和注解的简洁性,XML 负责全局配置,注解负责局部配置,是一种比较常用的方式。纯注解方式:适合于追求代码简洁性和开发效率的场景,完全基于 Java 配置和注解,减少了 XML 配置文件的使用,但对开发者的 Java 配置能力要求较高。

2301_77071977的博客 1004

Spring事务

&lt;?xml version="1.0" encoding="utf-8" ?&gt; &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://

wujingchangye的博客 147

Spring——Spring中的事务、XML配置事务属性、注解+XML、纯注解的配置方式 (重重点)、Spring的自动装配原理

三、基于 xml 配置声明式事务 1、解决银行转账问题: 在上面引出事务的代码基础上,只需要修改xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2...

Guizy 9403

声明式事务(注解与纯注解方式)

介绍了使用注解与纯注解的方式来实现声明式事务

凉茶铺的博客 2823

Spring 声明式事务的支持

文章目录Spring 声明式事务的支持事务回顾事务的概念事务的四大特性ACID事务的隔离级别Spring事务的7种传播行为Spring 中事务的APISpring 声明式事务配置纯xml模式基于xml+注解基于纯注解 Spring 声明式事务的支持 编程式事务 :在业务代码中添加事务控制代码,这样的事务控制机制就叫做编程式事务 声明式事务 :通过xml或者注解配置的方式达到事务控制的目的,叫做声明式事务 事务回顾 事务的概念 事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败

章全蛋的博客 613

Spring中的声明式事务

文章目录一、事务概述二、声明式事务概述三、声明式事务的使用1.环境准备2.XML配置事务管理3.注解配置事务管理4.纯注解配置5.Spring编程式事务 一、事务概述 事务的作用: ​ 将一个事务中所有的sql语句当作一个整体,要么全都成功,要么全都失败,通过这样的方式来保证数据的正确性; 事务的四大特性: 原子性:atomic,即事务中的多条语句是一个整体且不可分割,要么都成功要么都失败 隔离性:isolation,多个事务之间的执行不能相互影响 一致性:consistence,事务开始前和事务结束后

记录一只菜鸡的成长之路 416

基于XML和注解的声明式事务控制

本文以账户转账的demo演示spring分别基于xml和注解的声明式事务控制。讲述声明式事务控制配置步骤。

博主很懒,没有简介~ 585

Spring(七)声明式事务

声明式事务1. 基于XML的声明式事务2. 基于注解的声明式事务3. 纯注解的声明式事务 1. 基于XML的声明式事务 maven导包 <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> &

weixin_44962371的博客 168

Spring 声明式事务注解@Transactional

Spring 声明式事务注解@Transactional 1 结合xml配置使用 xml配置文件中加入 <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> &lt...

qq_41884972的博客 202
上一篇: Spring基于纯注解的配置
下一篇: SpringMVC
LEEWLD
博客等级 码龄9年 5粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值