Java设计模式之静态代理模式 (Spring Aop)
Aop 利用 代理模式实现功能增强
Aop能做什么? 日志管理, 事务管理, 权限控制
定义:
代理模式(Proxy或者Surrogate),中文翻译"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.一些情况下,一个客户不想或者不能够直接的引用第一个对象,而代理对象可以在客户端对象之间起到中介的作用
三种角色:
抽象主题角色:(现实生活中没有的, 代码里存在)
他声明了真是主题和代理主题的共同接口, 这样一来在任何地方可以使用真是主题的地方都可以使用代理主题
代理主题(Proxy) 角色
代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;
代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以代替真实主题;
控制对真实主题的尹建勇,负责需要的时候创建真实主题对象(和删除真实主题对象)
接下来写个保存订单的小例子给大家示范下:
1.接口订单service 接口方法,保存订单(抽象主题角色)
public interface OrderService { void saveOrder(Order order); }2. 写接口实现类(1.真实主题角色)
public class OrderServiceImpl implements OrderService { @Override public void saveOrder(Order order) { System.out.println("保存订单:" + order); } }
3.写代理主题对象,实现同一个接口:
public class OrderServiceProxy implements OrderService { @.....这边提供注入即可 OrderService orderService ; TxManager txManager ; @Override public void saveOrder(Order order) { try { txManager.begin(); orderService.saveOrder(order); }catch (Exception e){ txManager.rollback(e); }finally { txManager.release(); } }}
4.编写附加动作的事务类
public class TxManager { public void begin(){ System.out.println("开启事务"); } public void commit(){ System.out.println("提交事务"); } public void rollback(Exception e){ System.out.println("回滚事务" + e.getMessage()); } public void release(){ System.out.println("释放资源"); } }5. 测试
public static void main(String[] args) { Order order = new Order(); order.setDate(new Date().toString()); order.setId("T1111"); order.setOperateName("ZZ"); order.setProductName("水瓶"); OrderServiceProxy orderServiceProxy = new OrderServiceProxy(); orderServiceProxy.saveOrder(order); }结果展示:
如果代码中加入错误!结果展示:
静态代理有缺点!!
1: 因为他只能对一个接口进行调用,若果有N个接口,必须写N个代理类
2: 必须要实例化代理类 ,才能完成代理
所以静态代理无人用!!!!!当然我说的不是废话,
动态代理就可以去除这些缺点!!!!链接如下