aop入门前内容:静态代理
2015-09-12 21:35
323 查看
在学习aop之前,为了更好,更全面的理解aop打好基础。我们先要复习一下代理模式,首先我们来谈一下静态代理。
我们拿hibernate的一个小例子:
在保存学生的时候,经常使用到这样的语句:
通过上面的观察我们可以看到,hibernate操作数据库中的开启关闭事务都是固定的语句,但是每次的操作不一样。然后aop的目的就是把”变化”的语句跟”固定”分离开来。如下图所示:
代理类跟目标类实现同样的接口,并且代理类里面有目标类的引用
我们用保存Person来做例子:
运行结果:
我们拿hibernate的一个小例子:
在保存学生的时候,经常使用到这样的语句:
//开启事务 Transation transation=session.beginTransation(); //操作 session.update()/save()/delete(); //提交事务 transation.commit(); session.close();
通过上面的观察我们可以看到,hibernate操作数据库中的开启关闭事务都是固定的语句,但是每次的操作不一样。然后aop的目的就是把”变化”的语句跟”固定”分离开来。如下图所示:
静态代理的小例子
代理类跟目标类实现同样的接口,并且代理类里面有目标类的引用
我们用保存Person来做例子:
//接口: public interface PersonDAO { public void savePerson(); public void deletePerson(); public void updatePerson(); } //这个相当于目标类 public class PersonDAOImpl implements PersonDAO { @Override public void deletePerson() { System.out.println("delete person"); } @Override public void savePerson() { System.out.println("save person"); } @Override public void updatePerson() { System.out.println("update person"); } } //处理事务的类 public class transation { //开启事务 public void beginTransation(){ System.out.println("begin transation"); } //提交事务 public void commit(){ System.out.println("commit transation"); } } //代理类 public class PersonDAOProxy implements PersonDAO { //首先要有目标类的引用 private PersonDAO daoImpl; //由于要与事务分离开 所以另外在一个类 private transation transation; public PersonDAOProxy(PersonDAO daoImpl, transation transation) { this.daoImpl = daoImpl; this.transation = transation; } @Override public void deletePerson() { transation.beginTransation(); daoImpl.deletePerson(); transation.commit(); } @Override public void savePerson() { transation.beginTransation(); daoImpl.savePerson(); transation.commit(); } @Override public void updatePerson() { transation.beginTransation(); daoImpl.updatePerson(); transation.commit(); } } 配置文件: <!-- 在配置文件中把目标类,代理类还有事务类,放进sprig容器中。 并利用构造函数的方法为代理类的构造函数中的属性赋值 --> <bean id="personDAOImpl" class="cn.ansel.proxy.spring.PersonDAOImpl"></bean> <bean id="personDAOProxy" class="cn.ansel.proxy.spring.PersonDAOProxy"> <constructor-arg index="0" ref="personDAOImpl"></constructor-arg> <constructor-arg index="1" ref="transation"></constructor-arg> </bean> <bean id="transation" class="cn.ansel.proxy.spring.transation"></bean> //测试类 public class proxyTest { @Test public void testProxy(){ ApplicationContext applicationContext=new ClassPathXmlApplicationContext("cn/ansel/proxy/spring/applicationContext-proxy.xml"); PersonDAO dao=(PersonDAO) applicationContext.getBean("personDAOProxy"); dao.savePerson(); } }
运行结果:
小结及缺点分析:
从上面的代码我们可以看到,使用静态代理方法,还是有很多重复的代码,即所谓的代码的复用性不高,因为每次操作,都要开启/提交事务,非常麻烦,而且代码都是重复的。再者没运行一次,都要把对象new一次。相关文章推荐
- SQL Server误区30日谈 第1天 正在运行的事务在服务器故障转移后继续执行
- 浅析SQL Server中包含事务的存储过程
- Mysql中的事务是什么如何使用
- MySql的事务使用与示例详解
- C#分布式事务的超时处理实例分析
- yui3的AOP(面向切面编程)和OOP(面向对象编程)
- SQL Server的事务操作隔离模式介绍
- JavaScript AOP编程实例
- 使用AOP改善javascript代码
- 初识SmartJS - AOP三剑客
- oracle 合并查询 事务 sql函数小知识学习
- sql不常用函数总结以及事务,增加,删除触发器
- mysql的XA事务恢复过程详解
- 在Mysql存储过程中使用事务实例
- mysql存储过程事务管理简析
- php+mysql事务rollback&commit示例
- java使用动态代理来实现AOP(日志记录)的实例代码
- PHP中的事务使用实例
- PHP使用Mysql事务实例解析
- JavaScript之AOP编程实例