目录
2.3.3 使用 JDK 官方的 Proxy 类创建代理对象
2.3.4 使用 CGLib 的 Enhancer 类创建代理对象
-
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
- 解决办法:
-