正向代理和反向代理和spring的动态代理模式有几种?默认是那种?如何切换? |
您所在的位置:网站首页 › 代理模式有几种 › 正向代理和反向代理和spring的动态代理模式有几种?默认是那种?如何切换? |
spring的动态代理模式有几种?默认是那种?如何切换? spring的动态的代理模式有两种 JDK动态代理,基于接口(默认代理模式),CGLIB动态代理(若要使用需要进行配置) JDK动态代理是由java JDK提供 其缺点是只能为接口创建代理,返回的代理对象也只能转到某个接口类型 CGLIB动态大力是由是由第三方库cglib提供, CGLIB的实现机制与JDK的实现机制不同,它是通过继承实现的,它也是动态的创建一个类,但这个类的父类是被代理类 如何将代理模式由默认的JDK切换到CGLIB 配置aop 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(); } }执行结果
————————————————版权声明:本文为CSDN博主「莫言秋语」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/moyanqiuyu/article/details/84305295 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |