JDK动态代理和cglib代理

动态代理的代码示例

  • 真实对象
public class UserServiceImpl implements UserService {
    @Override
    public void save() {
        System.out.println("保存用户!");
    }
    @Override
    public void delete() {
        System.out.println("删除用户!");
    }
    @Override
    public void update() {
        System.out.println("更新用户!");
    }
    @Override
    public void find() {
        System.out.println("查找用户!");
    }
}
  • 代理工厂
public class UserServiceProxyFactory implements InvocationHandler {

    /**
    * 让调用者创建代理工厂的时候必须传入一个代理的真实对象,一个实例
    */
    public UserServiceProxyFactory(UserService us) {
        super();
        this.us = us;
    }

    private UserService us;

    /**
    * 获得代理对象
    */
    public UserService getUserServiceProxy(){
        //生成动态代理, this是指实InvocationHandler现接口的类
        UserService usProxy = (UserService) Proxy.newProxyInstance(UserServiceProxyFactory.class.getClassLoader(),
                    UserServiceImpl.class.getInterfaces(), this);
        //返回
        return usProxy;

    }

    /**
    * 对代理对象的方法进行增强
    */
    @Override
    public Object invoke(Object arg0, Method method, Object[] arg2) throws Throwable {
        System.out.println("打开事务!");

        //传入一个方法所在的对象(一个实例)和参数值
        Object invoke = method.invoke(us, arg2);

        System.out.println("提交事务!");
        return invoke;
    }
}
  • 测试代码
@Test
//动态代理
public void fun1(){
    UserService us = new UserServiceImpl();

    //传入一个真实对象获得一个代理工厂
    UserServiceProxyFactory factory = new UserServiceProxyFactory(us);

    //获得代理对象
    UserService usProxy = factory.getUserServiceProxy();

    //调用代理对象的方法
    usProxy.save();

    //代理对象与被代理对象实现了相同的接口
    //代理对象 与 被代理对象没有继承关系
    System.out.println(usProxy instanceof UserServiceImpl );//false
}
  • 结果
打开事物!
保存用户!
提交事务!

手动使用cglib代理代码示例

因为Spring结合了cglib,所以不需要导包直接使用包中方法

代理对象

public class UserServiceProxyFactory2 implements MethodInterceptor {

    /**
    * 获得代理对象
    */
    public UserService getUserServiceProxy(){

        //spring包中的cglib类,是获取代理对象
        Enhancer en = new Enhancer();

        //设置对谁进行代理
        en.setSuperclass(UserServiceImpl.class);

        //代理要做什么, 参数是传入实现MethodInterceptor接口的类
        en.setCallback(this);

        //创建代理对象
        UserService us = (UserService) en.create();

        return us;
    }

    @Override
    public Object intercept(Object prxoyobj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {
        //打开事务
        System.out.println("打开事务!");
        //调用原有方法
        Object returnValue = methodProxy.invokeSuper(prxoyobj, arg);
        //提交事务
        System.out.println("提交事务!");

        return returnValue;
    }
}

猜你喜欢

转载自blog.csdn.net/kato_op/article/details/80247390