四、AOP的介绍和使用

编程入门 行业动态 更新时间:2024-10-10 06:21:22

四、<a href=https://www.elefans.com/category/jswz/34/1767899.html style=AOP的介绍和使用"/>

四、AOP的介绍和使用

1 AOP的相关概念【理解】

1.1 AOP概述

1.1.1 什么是AOP

AOP:全称是Aspect Oriented Programming,即:面向切面编程。

简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。

1.1.2 AOP的作用及优势

  1. 作用:在程序运行期间,不修改源码对已有方法进行增强;
  2. 优势:减少重复代码、提高开发效率、维护方便。

1.1.3 AOP的实现方式

使用动态代理技术。

1.2 AOP的具体应用

1.2.1 案例中问题

这是我们昨天课程中做的增删改查例子。下面是客户的业务层实现类。我们能看出什么问题吗?
客户的业务层实现类:

/*** 账户的业务层实现类*/
public class AccountServiceImpl implements IAccountService {private IAccountDao accountDao;public void setAccountDao(IAccountDao accountDao) {this.accountDao = accountDao;}@Overridepublic void saveAccount(Account account) throws SQLException {accountDao.save(account);}@Overridepublic void updateAccount(Account account) throws SQLException {accountDao.update(account);}@Overridepublic void deleteAccount(Integer accountId) throws SQLException {accountDao.delete(accountId);}@Overridepublic Account findAccountById(Integer accountId) throws SQLException {return accountDao.findById(accountId);}@Overridepublic List<Account> findAllAccount() throws SQLException {return accountDao.findAll();}
}

问题就是:事务被自动控制了。换言之,我们使用了connection对象的setAutoCommit(true)
此方式控制事务,如果我们每次都执行一条sql语句,没有问题,但是如果业务方法一次要执行多条sql语句,这种方式就无法实现功能了。

请看下面的示例:我们在业务层中多加入一个方法。
业务层接口:

/*** 转账* @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);
}

当我们执行时,由于执行有异常,转账失败。但是因为我们是每次执行持久层方法都是独立事务,导致无法实现事务控制(不符合事务的一致性)。

1.2.2 问题的解决

让业务层来控制事务的提交和回滚。(这个我们之前已经在web阶段讲过了)
改造后的业务层实现类:

注意:此处没有使用spring的IoC。

/*** 账户的业务层实现类*/
public class AccountServiceImpl implements IAccountService {private IAccountDao accountDao = new AccountDaoImpl();@Overridepublic void saveAccount(Account account) {try {TransactionManager.beginTransaction();accountDao.save(account);TransactionManagermit();} catch (Exception e) {TransactionManager.rollback();e.printStackTrace();} finally {TransactionManager.release();}}@Overridepublic void updateAccount(Account account) {try {TransactionManager.beginTransaction();accountDao.update(account);TransactionManagermit();} catch (Exception e) {TransactionManager.rollback();e.printStackTrace();} finally {TransactionManager.release();}}@Overridepublic void deleteAccount(Integer accountId) {try {TransactionManager.beginTransaction();accountDao.delete(accountId);TransactionManagermit();} catch (Exception e) {TransactionManager.rollback();e.printStackTrace();} finally {TransactionManager.release();}}@Overridepublic Account findAccountById(Integer accountId) {Account account = null;try {TransactionManager.beginTransaction();account = accountDao.findById(accountId);TransactionManagermit();return account;} catch (Exception e) {TransactionManager.rollback();e.printStackTrace();} finally {TransactionManager.release();}return null;}@Overridepublic List<Account> findAllAccount() {List<Account> accounts = null;try {TransactionManager.beginTransaction();accounts = accountDao.findAll();TransactionManagermit();return accounts;} catch (Exception e) {TransactionManager.rollback();e.printStackTrace();} finally {TransactionManager.release();}return null;}@Overridepublic void transfer(String sourceName, String targetName, Float money) {try {TransactionManager.beginTransaction();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);TransactionManagermit()

更多推荐

四、AOP的介绍和使用

本文发布于:2024-02-07 02:26:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1752093.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:AOP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!