Spring代理模式

Posted MyBatis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring代理模式相关的知识,希望对你有一定的参考价值。

1.静态代理

 抽象主题 :Subject 

public interface Subject {
    public String add();
}

目标对象:ReSubject 

public class ReSubject implements Subject {
    public String add() {
        System.out.println("ok!");
        return "";
    }
}

 代理对象:Psubject 

技术分享
public class Psubject implements Subject {

    private Subject reSubject;

    public Subject getReSubject() {
        return reSubject;
    }

    public void setReSubject(Subject reSubject) {
        this.reSubject = reSubject;
    }

    public String add() {
        System.out.println("开启!");
        return reSubject.add();
    }
}
技术分享

单侧   

技术分享
 //静态代理
    @Test
    public void test12(){
        Subject subject=new ReSubject();
        Psubject psubject=new Psubject();
        psubject.setReSubject(subject);
        psubject.add();
    }
技术分享

 

2.动态代理

接口

public interface IUserDAO {
    public String add();
    public String edit();
}

 

技术分享
public class UserDAOImpl implements IUserDAO{
    public String add() {
        System.out.println("add");
        return "add";
    }

    public String edit() {
        System.out.println("edit");
        return "edit";
    }
}
技术分享

单侧

技术分享
//动态代理
    @Test
    public void test13(){
       final IUserDAO dao=new UserDAOImpl();
       IUserDAO pp=(IUserDAO) Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(), new InvocationHandler() {
           public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
               System.out.println("开启");
               method.invoke(dao,args);
               return null;
           }
       });
       pp.add();
       pp.edit();
    }
技术分享

3.cglib动态代理

public class Userservice {
    public void delete(){
        System.out.println("ok");
    }
}

单侧(两种方式)

技术分享
 /*cglib动态代理*/
    @Test
    public void test14(){
        final Userservice servive=new Userservice();
        Enhancer enhancer=new Enhancer();
        enhancer.setSuperclass(servive.getClass());
        enhancer.setCallback(new MethodInterceptor() {
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("开启");
                methodProxy.invoke(servive,objects);
                return null;
            }
        });
       /* enhancer.setCallback(new org.springframework.cglib.proxy.InvocationHandler() {
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                System.out.println("开启");
                method.invoke(servive,objects);
                return null;
            }
        });*/
        Userservice aa =(Userservice) enhancer.create();
        aa.delete();
    }
技术分享

以上是关于Spring代理模式的主要内容,如果未能解决你的问题,请参考以下文章

阿里四面:你知道Spring AOP创建Proxy的过程吗?

Spring之静态/动态代理模式

spring aop中this和target区别

代理模式 - spring aop 抛砖

代理模式 - spring aop 抛砖

spring-aop