spring的动态代理模式有几种?默认是那种?如何切换?

spring的动态的代理模式有两种

JDK动态代理,基于接口(默认代理模式),CGLIB动态代理(若要使用需要进行配置)

JDK动态代理是由java JDK提供

   其缺点是只能为接口创建代理,返回的代理对象也只能转到某个接口类型

CGLIB动态大力是由是由第三方库cglib提供

CGLIB的实现机制与JDK的实现机制不同,它是通过继承实现的,它也是动态的创建一个类,但这个类的父类是被代理类

如何将代理模式由默认的JDK切换到CGLIB

配置aop <aop:config proxy-target-class="true"> true使用CGLIB产生代理对象 false 使用jdk 默认false。

通过代码模拟事务控制 

JDK动态代理 

Java SDK代理的是对象,需要先有一个实际对象,自定义的InvocationHandler引用该对象,然后创建一个代理类 和代理对象,客户端访问的是代理对象,代理对象后再调用实际对象的方法

package com.baizhi.c_dynamic_proxy;
 
import com.baizhi.service.UserService; 
import com.baizhi.service.impl.UserServiceImpl;
 
import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 
import java.lang.reflect.Proxy;
 
public class TestDynamicProxy {
 
    public static void main(String[] args) {
 
        //1.目标对象  被代理对象(实现类)        
        final UserService userService = new UserServiceImpl();
 
        //2.使用Proxy创建代理类对象        
        UserService proxy = (UserService) Proxy.newProxyInstance
        (TestDynamicProxy.class.getClassLoader(),new Class[]   
        {UserService.class},
        new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args)            
            throws Throwable {        
                //System.out.println(proxy.hashCode());                        
                System.out.println("开启事务...");

                //调用实际对象的方法
                Object result = method.invoke(userService,args);
                System.out.println("提交事务...");
                return result;
        }
           });
        System.out.println(proxy.getClass());
 
        proxy.reg();
 
       /* UserService userService = new UserServiceImpl();
        UserService proxy = (UserService) new MyDynamicProxy
                            (userService).newProxyInstance();
        System.out.println(proxy);*/
        //proxy.reg();
 
    }
 
}
 

执行结果


Cglib动态代理 

cglib代理的是类,创建的对象只有一个。
 

package com.baizhi.d_cglib_proxy;
 
import com.baizhi.service.impl.UserServiceImpl; 
import org.springframework.cglib.proxy.Callback; 
import org.springframework.cglib.proxy.Enhancer; 
import org.springframework.cglib.proxy.MethodInterceptor; 
import org.springframework.cglib.proxy.MethodProxy;
 
import java.lang.reflect.Method;
 
public class TestCglibProxy {
 
    public static void main(final String[] args) { 
        //enhancer 代理对象
        Enhancer enhancer = new Enhancer();
        //基于继承 参数是实现类的class  UserServiceImpl被代理对象
        enhancer.setSuperclass(UserServiceImpl.class);
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, 
                MethodProxy methodProxy) throws Throwable { 
                System.out.println("开启事务...");
                Object result = methodProxy.invokeSuper(o,objects);    
                System.out.println("结束事务...");
                return result;
            }
        });        
        UserServiceImpl o2 = (UserServiceImpl) enhancer.create();  
        System.out.println(o2.getClass());
        o2.reg();
 
    }
 
 
}
         

执行结果

 

 

 

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值