博客
关于我
Spring中基于纯注解的声明式事务控制
阅读量:682 次
发布时间:2019-03-17

本文共 6192 字,大约阅读时间需要 20 分钟。

项目结构优化与实现详解

作为一个开发者,我最近工作中接触到了一个基于Spring Boot的Maven项目开发。这个项目包含多个核心组件,从配置的实现到业务逻辑的处理,我决定在这里详细记录我的思考过程和解决方案。


1. 项目依赖管理

项目的根目录下包含了一个POM文件,作为Maven依赖管理的基础。根据POM文件内容,这个项目引用的主要库包括:

  • Spring Boot:用于构建分层架构
  • MySQL:作为项目的持久层存储解决方案
  • AspectJ:用于支持AOP编程
  • JUnit:用于单元测试

项目的《dependencies》部分非常详细,包含了更加具体的版本控制和依赖关系。以下是部分关键点:

org.springframework
spring-context
5.0.2.RELEASE
com.mysql
mysql-connector-java
8.0.16
org.springframework
spring-tx
5.0.2.RELEASE

从上述代码可以看出,数据库连接模块十分关键。 mysql-connector-java 用于处理数据库连接,而 spring-tx 则用于事务管理。我在后续的分析中会详细探讨数据库连接的实现细节。


2. 项目组成与层次结构

项目采用了典型的Maven多层项目结构,各层次的实现相互依赖,构建了一个完整的开发环境。项目结构如下:

ještě没有看到相关的详细项目结构,但根据文件内容可以,目录包括:- src/main/java/ : 项目主源代码目录  - com/qublog/ : 项目的核心包      - domain/ : 领域模型 - Account类      - dao/ : 持久层 - AccountDao接口与实现      - service/ : 业务逻辑层 - AccountService接口与实现      - config/ : 配置类(Spring Boot配置)- src/test/java/ : 测试源代码目录

接下来,我们将重点聚焦于项目的核心实现部分。


3. 账户类(Domain Layer)

账户类是项目的核心实体类,包含三个主要属性:

public class Account implements Serializable {    private Integer id;    private String name;    private Float money;        //fields getters与setters}

作为一个持久化实体类,Account 类需要与数据库进行交互。接下来,我们详细分析其持久层实现。


4. 持久层实现(AccountDao)

持久层的 عمل是将数据访问与业务逻辑分离。在本项目中,账户持久层由两部分实现:

4.1 接口定义

public interface AccountDao {    // 根据id查询账户    Account findAccountById(Integer id);    // 根据name查询账户    Account findAccountByName(String name);    // 更新账户    void updateAccount(Account account);}

4.2 实现类

@Repository("accountDao")public class AccountDaoImpl implements AccountDao {    @Autowired    private JdbcTemplate jdbcTemplate;    public Account findAccountById(Integer id) {        List
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
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() ); }}

在这里,我针对数据访问逻辑进行了详细分析。特别需要注意的是,查询账户时的异常处理,如非唯一结果的抛出。这在实际开发中至关重要。


5. 业务逻辑实现(AccountService)

业务逻辑是系统的核心部分。在本项目中,业务逻辑主要集中在转账功能上。接下来,我详细分析这一部分的实现。

5.1 接口定义

public interface AccountService {    // 根据id查询账户    Account findAccountById(Integer id);    // 转账    void transfer(String sourceName, String targetName, Float money);}

5.2 实现类

@Service("accountService")@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)public class AccountServiceImpl implements AccountService {    @Autowired    private AccountDao 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("开始转账...");        // 找到转账来源账户        Account source = accountDao.findAccountByName(sourceName);        // 找到转账目标账户                Account target = accountDao.findAccountByName(targetName);        // 执行转账逻辑        source.setMoney(source.getMoney() - money);        target.setMoney(target.get Money() + money);        // 更新账户数据        accountDao.updateAccount(source);        accountDao.updateAccount(target);    }}

在这一部分,我关注到事务管理的使用。这段代码利用了Spring的@Transactional注解,确保了事务的完整性和一致性。通过@ReadOnly = true,我们还可以限制事务的读写模式,强化代码的健壮性。


6. Spring Boot配置与数据库连接

在前面的分析中,已经概述了依赖管理部分。接下来,我将详细分析数据库连接和事务管理模块的实现。

6.1 JdbcConfig 类

@Configurationpublic 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;    @Bean(name = "jdbcTemplate")    public JdbcTemplate createJdbcTemplate(DataSource dataSource) {        return new JdbcTemplate(dataSource);    }    @Bean(name = "dataSource")    public DataSource createDataSource() {        DriverManagerDataSource ds = new DriverManagerDataSource();        ds.setDriverClassName(driver);        ds.setUrl(url);        ds.setUsername(username);        ds.setPassword(password);        return ds;    }}

这个配置类负责创建JDBC数据源和JdbcTemplate。在实际应用中,我们需要配置jdbcConfig.properties文件,设置相关连接信息。

6.2 TransactionConfig 类

@Configurationpublic class TransactionConfig {    @Bean(name = "transactionManager")    public PlatformTransactionManager createTransactionManager(DataSource dataSource) {        return new DataSourceTransactionManager(dataSource);    }}

这部分配置创建了一个事务管理器,这将在后续的业务逻辑中发挥重要作用。


7. 关键的测试验证

随着配置的完成和代码的提交,单元测试阶段是保证代码正确性的关键环节。在本项目中,主要是针对AccountService的转账功能进行测试。

7.1 测试类

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = {SpringConfiguration.class})public class AccountServiceTest {    @Autowired    private AccountService as;    @Test    public void testTransfer() {        as.transfer("source账户名", "target账户名", 100f);    }}

虽然测试类中的测试代码非常简洁,但它确保了我们的转账功能在开发环境中能够正常运行。这也是对所有返场过程进行验证的重要环节。


8. 项目优化与思考

作为开发者,在项目中我遇到的主要问题是数据库连接的配置以及事务管理的集成。通过前期的理论学习和实践练习,我逐步掌握了如何在Spring Boot项目中配置数据库连接和事务管理器。此外,我也学会了如何更高效地进行代码编写和调试。

在实际开发过程中,我还需要注意以下几点:

  • 依赖管理的细节:每个依赖的版本选择对项目稳定性至关重要。需要对项目的依赖进行定期更新,并确保兼容性。
  • 数据源的安全性:数据库连接信息应安全处理,避免在代码中硬编码_sensitive信息。
  • 事务管理的细节:尽管使用了Spring的@Transactional注解,但在实际开发中可能需要手动管理事务。
  • 通过这次项目的实践,我对Spring Boot的项目结构和配置有了更深入的理解。同时,也遇到了许多常见的开发问题,并学会了如何在实际项目中解决这些问题。


    9. 结语

    总的来说,这个项目让我熟悉了Spring Boot的开发流程,包括依赖管理、数据库连接配置以及事务管理等核心知识点。这一过程充满了挑战和收获,但也让我对前端和后端的分层架构有了更加清晰的理解。在接下来的开发中,我将继续练习Spring Boot的相关技术,并尝试更多实战项目来巩固所学内容。

    转载地址:http://ifchz.baihongyu.com/

    你可能感兴趣的文章
    mysql 更新子表_mysql 在update中实现子查询的方式
    查看>>
    MySQL 有什么优点?
    查看>>
    mysql 权限整理记录
    查看>>
    mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
    查看>>
    MYSQL 查看最大连接数和修改最大连接数
    查看>>
    MySQL 查看有哪些表
    查看>>
    mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
    查看>>
    MySql 查询以逗号分隔的字符串的方法(正则)
    查看>>
    MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
    查看>>
    mysql 查询数据库所有表的字段信息
    查看>>
    【Java基础】什么是面向对象?
    查看>>
    mysql 查询,正数降序排序,负数升序排序
    查看>>
    MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
    查看>>
    mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
    查看>>
    mysql 死锁(先delete 后insert)日志分析
    查看>>
    MySQL 死锁了,怎么办?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 添加列,修改列,删除列
    查看>>
    mysql 添加索引
    查看>>