spring中的代理模式

JDK动态代理

 

1 新建一个接口

public interface Person {

    public void findJob();

    public void findFriend();
}

2 为接口创建一个实现类


public class Bobby implements Person {
    @Override
    public void findJob() {
        System.out.println("Make fifty some dollars a day");
    }

    @Override
    public void findFriend() {
        System.out.println("I want BBW");
    }
}

3 创建代理类实现java.lang.reflect.InvocationHandler接口

public class JDKMeipo implements InvocationHandler {

    //    目标对象   jdk动态代理针对接口
    private Person target;

    public Object getInstance(Person target) {
        this.target = target;
        Class<? extends Person> targetClass = target.getClass();
        Object o = Proxy.newProxyInstance(targetClass.getClassLoader(), targetClass.getInterfaces(), this);

        return o;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("jdk代理启动------------");
        method.invoke(this.target,args);
        System.out.println("jdk代理结束-----------");
        return null;
    }
}

4 测试

public class JDKMeipoTest {

    public static void main(String[] args) {
        Person instance = (Person)new JDKMeipo().getInstance(new Bobby());
        instance.findFriend();
    }
}

Cglib代理

1 实现一个业务类,注意,这个业务类并没有实现任何接口(这边顺便验证了下如果有返回参数怎么做到)

public class XiaoMing {

    public Object findFriend(String name) {
        return name;
    }
}

2 一个代理类实现 MethodInterceptor 接口

public class CglibProxy implements MethodInterceptor {

    public Object getInstance(Class<?> clazz) {

        Enhancer enhancer = new Enhancer();
        //设置代理目标类
        enhancer.setSuperclass(clazz);

        enhancer.setCallback(this);

        return enhancer.create();
    }


    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        //业务增强
        System.out.println("CglibProxy start -------------");
        //ret 为方法执行的返回值  
        Object ret = methodProxy.invokeSuper(o, objects);
        System.out.println("CglibProxy end -------------");
        return ret;
    }
}

3 测试

public class CglibProxyTest {

    public static void main(String[] args) {
        XiaoMing instance = (XiaoMing)new CglibProxy().getInstance(XiaoMing.class);
        String bobby = (String)instance.findFriend("Bobby");
        System.out.println(bobby);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值