================== Spring AOP静态代理 ================== 1 没有代理 新建Java项目SpringAOP。 在cn.tedu.springaop.dao包中创建BookDao类: public class BookDao { public void insert() { System.out.println("开启事务"); System.out.println("在t_book表中插入一条记录"); System.out.println("提交事务"); } public void modify() { System.out.println("开启事务"); System.out.println("修改t_book表中的一条记录"); System.out.println("提交事务"); } public void delete() { System.out.println("开启事务"); System.out.println("在t_book表中删除一条记录"); System.out.println("提交事务"); } } 在cn.tedu.springaop.test包中创建BookDaoTest类: public class BookDaoTest { public static void main(String[] args) { BookDao bookDao = new BookDao(); bookDao.insert(); bookDao.modify(); bookDao.delete(); } } 运行测试: 开启事务 在t_book表中插入一条记录 提交事务 开启事务 修改t_book表中的一条记录 提交事务 开启事务 在t_book表中删除一条记录 提交事务 例程:SpringAOP 问题:在BookDao类中,开启事务、提交事务的代码重复了很多遍。 2 添加代理 在cn.tedu.springaop.proxy包中创建BookDaoProxy类: public class BookDaoProxy { private BookDao bookDao = new BookDao(); public void insert() { begin(); bookDao.insert(); commit(); } public void modify() { begin(); bookDao.modify(); commit(); } public void delete() { begin(); bookDao.delete(); commit(); } private void begin() { System.out.println("开启事务"); } private void commit() { System.out.println("提交事务"); } } 简化BookDao类: public class BookDao { public void insert() { System.out.println("在t_book表中插入一条记录"); } public void modify() { System.out.println("修改t_book表中的一条记录"); } public void delete() { System.out.println("在t_book表中删除一条记录"); } } 修改BookDaoTest类: public class BookDaoTest { public static void main(String[] args) { BookDaoProxy bookDaoProxy = new BookDaoProxy(); bookDaoProxy.insert(); bookDaoProxy.modify(); bookDaoProxy.delete(); } } 运行测试: 开启事务 在t_book表中插入一条记录 提交事务 开启事务 修改t_book表中的一条记录 提交事务 开启事务 在t_book表中删除一条记录 提交事务 在BookDao类中,与具体业务无关的共性操作,如开启事务、提交事务等被剥离出去。 BookDaoProxy只能代理BookDao一个类。 例程:SpringAOP 3 面向接口 在cn.tedu.springaop.dao包中创建Dao接口: public interface Dao { public void insert(); public void modify(); public void delete(); } BookDaoImpl类是Dao接口的一个实现: public class BookDaoImpl implements Dao { public void insert() { System.out.println("在t_book表中插入一条记录"); } public void modify() { System.out.println("修改t_book表中的一条记录"); } public void delete() { System.out.println("在t_book表中删除一条记录"); } } 与具体Dao实现无关的,更抽象的DaoProxy类: public class DaoProxy { private Dao dao; public DaoProxy(Dao dao) { this.dao = dao; } public void insert() { begin(); dao.insert(); commit(); } public void modify() { begin(); dao.modify(); commit(); } public void delete() { begin(); dao.delete(); commit(); } private void begin() { System.out.println("开启事务"); } private void commit() { System.out.println("提交事务"); } } 测试: public class DaoProxyTest { public static void main(String[] args) { DaoProxy daoProxy = new DaoProxy(new BookDaoImpl()); daoProxy.insert(); daoProxy.modify(); daoProxy.delete(); } } 开启事务 在t_book表中插入一条记录 提交事务 开启事务 修改t_book表中的一条记录 提交事务 开启事务 在t_book表中删除一条记录 提交事务 DaoProxy可以代理Dao接口的任意实现类: public class StudentDaoImpl implements Dao { public void insert() { System.out.println("在t_student表中插入一条记录"); } public void modify() { System.out.println("修改t_student表中的一条记录"); } public void delete() { System.out.println("在t_student表中删除一条记录"); } } public class DaoProxyTest { public static void main(String[] args) { DaoProxy daoProxy = new DaoProxy(new StudentDaoImpl()); daoProxy.insert(); daoProxy.modify(); daoProxy.delete(); } } 开启事务 在t_student表中插入一条记录 提交事务 开启事务 修改t_student表中的一条记录 提交事务 开启事务 在t_student表中删除一条记录 提交事务 例程:SpringAOP 4 静态代理 DaoProxy只能代理Dao接口的实现类,此局限源于其dao属性的静态类型——Dao,谓之静态代理: - 被代理对象只需关注核心业务,将一般性的管理型逻辑(如事务、日志等)和特殊性的业务型逻辑分离——低耦合。 - 通用代码只在代理类中编写一遍,被代理对象即可共享之——高复用。 - 与核心业务无关的扩展,只发生在代理类中——可扩展。 增加统计执行时间功能: public class DaoProxy { ... private long btime; ... private void begin() { System.out.println("开启事务"); btime = System.nanoTime(); } private void commit() { System.out.println("提交事务(" + (System.nanoTime() - btime) / 1000 + "微秒)"); } ... } 开启事务 在t_student表中插入一条记录 提交事务(126微秒) 开启事务 修改t_student表中的一条记录 提交事务(44微秒) 开启事务 在t_student表中删除一条记录 提交事务(32微秒) 例程:SpringAOP