Java设计模式之静态代理模式 (Spring Aop)

Aop 利用 代理模式实现功能增强

Aop能做什么?  日志管理, 事务管理, 权限控制

定义:

代理模式(Proxy或者Surrogate),中文翻译"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.一些情况下,一个客户不想或者不能够直接的引用第一个对象,而代理对象可以在客户端对象之间起到中介的作用

三种角色:

    抽象主题角色:(现实生活中没有的, 代码里存在)

         他声明了真是主题和代理主题的共同接口, 这样一来在任何地方可以使用真是主题的地方都可以使用代理主题

    代理主题(Proxy) 角色

     代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;

    代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以代替真实主题;

    控制对真实主题的尹建勇,负责需要的时候创建真实主题对象(和删除真实主题对象)

    Java设计模式之静态代理模式 (Spring Aop)

接下来写个保存订单的小例子给大家示范下:

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);
}
结果展示:

Java设计模式之静态代理模式 (Spring Aop)

如果代码中加入错误!结果展示:

Java设计模式之静态代理模式 (Spring Aop)

静态代理有缺点!!

1:  因为他只能对一个接口进行调用,若果有N个接口,必须写N个代理类

2:  必须要实例化代理类 ,才能完成代理


所以静态代理无人用!!!!!当然我说的不是废话,

动态代理就可以去除这些缺点!!!!链接如下