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();
 
    }
 
 
}
         

执行结果

 

 

 

### 回答1: Spring框架是一个非常流行的Java开发框架,但在一些特定的场景下,Spring可能会失效。以下是几种可能会导致Spring失效的场景: 1. 高并发场景:在高并发的场景下,Spring框架的性能可能无法满足需求。这是因为Spring框架需要进行大量的对象创建和依赖注入,这些操作会消耗大量的CPU时间和内存资源。 2. 大数据量场景:在处理大量数据的场景下,Spring框架的性能也可能会受到影响。因为Spring框架需要进行大量的对象创建和依赖注入,这些操作会消耗大量的内存资源。 3. 分布式系统场景:在分布式系统场景下,Spring框架的性能也可能会受到影响。因为Spring框架可能会涉及到分布式事务管理、分布式缓存管理等操作,这些操作会对系统的性能产生影响。 4. 特殊业务场景:在一些特殊的业务场景下,Spring框架可能会失效。比如实时性要求比较高的业务场景,Spring框架的性能可能无法满足实时性要求。 需要注意的是,这些场景下Spring框架可能会失效,但并不代表Spring框架就没有用处。Spring框架依然是一个非常优秀的框架,可以在大多数场景下发挥良好的作用。 ### 回答2: Spring在以下几种场景下可能会失效: 1. 高并发场景:当系统面临高并发请求时,Spring可能会失效。这是因为Spring使用对象池和线程池来管理对象和线程,当系统面临高并发请求时,对象池和线程池可能会出现资源竞争和瓶颈问题,导致性能下降或系统崩溃。 2. 大数据处理场景:当系统需要处理大量的数据时,Spring可能会失效。这是因为Spring的IOC容器会对所有被管理的对象进行初始化和注入依赖,当系统需要处理的数据量很大时,对象的初始化和注入会导致内存占用过大,从而影响系统的性能和响应速度。 3. 分布式系统场景:当系统需要构建分布式架构时,Spring可能会失效。这是因为Spring的IOC容器和AOP机制都是基于Java虚拟机的单机环境设计的,无法直接支持跨服务器的远程调用和分布式事务处理,需要借助其他技术,如Dubbo、Spring Cloud等来解决这些问题。 4. 实时系统场景:当系统需要实时处理请求或数据时,Spring可能会失效。这是因为Spring的核心是基于反射机制实现的,反射的性能相对较低,无法满足实时性要求较高的系统需求。对于实时系统,建议使用更轻量级的框架或者原生的Java编程实现。 总的来说,虽然Spring是一款功能强大的框架,但在特定的场景下可能会失去一些优势,需要根据具体的系统需求和性能要求来选择合适的技术和架构方案。 ### 回答3: Spring在以下几种场景下可能会失效: 1. 高并发场景:当系统面临高并发请求时,由于Spring默认配置是单例模式,多个请求同时访问同一个实例可能会导致数据混乱或资源竞争问题,从而导致Spring失效。 2. 内存占用过大场景:由于Spring框架需要维护大量的对象和依赖关系,如果系统中的Bean对象过多或者依赖关系复杂,可能导致Spring框架在内存中占用过多资源,从而导致系统性能下降或者内存溢出。 3. 复杂业务逻辑场景:在一些业务逻辑复杂的场景下,由于Spring框架的AOP、事务管理等功能实现在运行时需要动态代理等操作,这些操作会带来额外的性能开销,从而影响系统的处理效率。 4. 不适合的应用场景:在一些特定的应用场景下,如实时性要求极高的高频交易系统,可能不适合使用Spring框架。因为Spring框架会引入一定的开销,无论是运行时切面、依赖注入还是其他功能,都会牺牲一定的性能。 总的来说,Spring框架的设计初衷是为了提供一种优雅的方式来管理Java应用程序的组件和依赖关系,提高开发效率和系统可维护性。但在某些场景下,由于性能消耗、资源占用或者复杂性等原因,可能会使得Spring框架在某些方面失去它的优势,因此在选择使用Spring框架时需要根据具体的应用需求进行评估。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值