装饰者、JDK动态代理和CGLIB动态代理 三种设计模式 教你实现AOP

定义一个普通dao类和daoImpl类来模式实现三种aop,对dao类中的方法进行增强日志功能

定义一个DAO接口:

public interface Dao {
    void insert();
    void query();
    void update();
}

DAO接口实现类:

public class DaoImpl implements Dao {
    @Override
    public void insert() {
        System.out.println("add boeing787!");
    }

    @Override
    public void query() {
        System.out.println("boeing737Max over in 20190311");
    }

    @Override
    public void update() {
        System.out.println("update boeing 737Max to 737-800!");
    }
}

1.装饰者类:

public class DaoDecorator  implements Dao {
    Dao dao;

    public DaoDecorator(Dao dao) {
        this.dao = dao;
    }

    @Override
    public void insert() {
        System.out.println("---decorator bofore...");
        dao.insert();
        System.out.println("---decorator after...");
        System.out.println("---------------------------------------");
    }

    @Override
    public void query() {
        System.out.println("---decorator bofore...");
        dao.query();
        System.out.println("---decorator after...");
        System.out.println("---------------------------------------");
    }

    @Override
    public void update() {
        System.out.println("---decorator bofore...");
        dao.update();
        System.out.println("---decorator after...");
        System.out.println("---------------------------------------");
    }
}

2.jdk代理类:

public class DaoJDKProxy implements InvocationHandler {
    private Object target;

    public DaoJDKProxy(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("---jdk before...");
        Object object = method.invoke(target,args);
        System.out.println("---jdk after...");
        System.out.println("---------------------------------------");
        return object;
    }
}

 

3.cglib代理类:

public class DaoCglibProxy implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("---cglib bofore...");
        Object result = methodProxy.invokeSuper(o,args);
        System.out.println("---cglib after...");
        System.out.println("---------------------------------------");
        return result;
    }
}

4.统一测试类:

public class Test {
    public static void main(String[] args) {
        //装饰者模式的aop
       DaoDecorator daoDecorator =  new DaoDecorator(new DaoImpl());
       daoDecorator.insert();
       daoDecorator.query();
       daoDecorator.update();

       //jdk模式的aop
        DaoJDKProxy daoJDKProxy = new DaoJDKProxy(new DaoImpl());
        Dao proxy = (Dao) Proxy.newProxyInstance(Test.class.getClassLoader(),new Class<?>[]{Dao.class},daoJDKProxy);
        proxy.insert();
        proxy.query();
        proxy.update();

        //cglib模式的aop
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(DaoImpl.class);
        enhancer.setCallback(new DaoCglibProxy());
        DaoImpl dao = (DaoImpl) enhancer.create();
        dao.insert();
        dao.query();
        dao.update();

    }
}

5.运行结果:

"C:\Program Files\Java\jdk1.8.0_171\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 
---decorator bofore...
add boeing787!
---decorator after...
---decorator bofore...
boeing737Max over in 20190311
---decorator after...
---decorator bofore...
update boeing 737Max to 737-800!
---decorator after...
---------------------------------------
---jdk before...
add boeing787!
---jdk after...
---------------------------------------
---jdk before...
boeing737Max over in 20190311
---jdk after...
---------------------------------------
---jdk before...
update boeing 737Max to 737-800!
---jdk after...
---------------------------------------
---cglib bofore...
add boeing787!
---cglib after...
---------------------------------------
---cglib bofore...
boeing737Max over in 20190311
---cglib after...
---------------------------------------
---cglib bofore...
update boeing 737Max to 737-800!
---cglib after...
---------------------------------------

Process finished with exit code 0
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值