Java_Spring:7. AOP 的相关概念

本文介绍了Java Spring中的AOP概念,包括其定义、作用和优势,并通过案例展示了AOP如何解决代码重复和事务控制问题。文章详细讨论了动态代理,包括JDK和CGLib两种实现方式,以及如何利用它们来简化业务层代码并实现事务管理。
摘要由CSDN通过智能技术生成

目录

1 AOP 概述

1.1 什么是 AOP

1.2 AOP 的作用及优势

1.3 AOP 的实现方式

2 AOP 的具体应用

2.1 案例中问题

2.2 问题的解决

2.3 动态代理回顾

2.3.1 动态代理的特点

2.3.2 动态代理常用的有两种方式

2.3.3 使用 JDK 官方的 Proxy 类创建代理对象

2.3.4 使用 CGLib 的 Enhancer 类创建代理对象

2.5 解决案例中的问题


  • 1 AOP 概述

    • 1.1 什么是 AOP

      • AOP:全称是 Aspect Oriented Programming 即:面向切面编程
      • 简单的说它就是把程序重复代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对已有方法进行增强
    • 1.2 AOP 的作用及优势

      • 作用:
        • 在程序运行期间,不修改源码对已有方法进行增强。
      • 优势:
        • 减少重复代码
        • 提高开发效率
        • 维护方便
    • 1.3 AOP 的实现方式

      • 使用动态代理技术
  • 2 AOP 的具体应用

    • 2.1 案例中问题

      • 客户的业务层实现类
      • 问题:
        • 事务被自动控制了,即使用了 connection 对象的 setAutoCommit(true)
        • 此方式控制事务,可实现每次都执行一条 sql 语句,但无法实现一次要执行多条 sql语句
      • public class AccountServiceImpl implements IAccountService {
            
            private IAccountDao accountDao;
                public void setAccountDao(IAccountDao accountDao) {
                this.accountDao = accountDao;
            }
        
            @Override
            public void saveAccount(Account account) throws SQLException {
                accountDao.save(account);
            }
        
            @Override
            public void updateAccount(Account account) throws SQLException{
                accountDao.update(account);
            }
        
            @Override
            public void deleteAccount(Integer accountId) throws SQLException{
                accountDao.delete(accountId);
            }
        
            @Override
            public Account findAccountById(Integer accountId) throws SQLException {
                return accountDao.findById(accountId);
            }
        
            @Override
            public List<Account> findAllAccount() throws SQLException{
                return accountDao.findAll();
            }
        }
      • 考虑在业务层中多加入一个方法。
      • 业务层接口
      • /**
        * 转账
        * @param sourceName
        * @param targetName
        * @param money
        */
        void transfer(String sourceName,String targetName,Float money);
      • 业务层实现类:
      • @Override
        public void transfer(String sourceName, String targetName, Float money) {
        
            //根据名称查询两个账户信息
            Account source = accountDao.findByName(sourceName);
            Account target = accountDao.findByName(targetName);
        
            //转出账户减钱,转入账户加钱
            source.setMoney(source.getMoney()-money);
            target.setMoney(target.getMoney()+money);
        
            //更新两个账户
            accountDao.update(source);
            int i=1/0; //模拟转账异常
            accountDao.update(target);
        }
      • 当执行时,由于执行有异常,转账失败。但是因为每次执行持久层方法都是独立事务,导致无法实现事务控制(不符合事务的一致性)
    • 2.2 问题的解决

      • 解决办法:
        • 让业务层来控制事务的提交和回滚。
      • 改造后的业务层实现类:
      • 注:此处没有使用 spring 的 IoC.
      • 账户的业务层实现类
      • public class AccountServiceImpl implements IAccountService {
        
            private IAc
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值