`
y806839048
  • 浏览: 1126631 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

jdk,cglib代理

 
阅读更多

jpa注解需要cglib代理????????????????

annotation-driven 中的proxy-target-class是注入方式(针对一个bean来讲,是jdk形式对应的接口注入,还是cglib的子类注入)

aspectj-autoproxy 生成切面bean的方式,(针对生产的代理对象用jdk方式,还是cglib方式)

对于生产代理对象来讲都可,除非目标对象有接口,否则只能用cglib的注入,(cglib用来继承类或实现接口以产生对象。)使用cglib要加jar包

用jdk代理目标对象要有接口

用cglib目标对象不能为final

 

 

代理于事务:

因为我们使用事务基于service,service是代理生成的所以,代理的方式和事务配置的起作用的代理方式要一致,否则也会导致事务无效,要么遵循标签写在实现类方法上

 

http://sishuok.com/forum/blogPost/list/3845.html

 

<tx:annotation-driven transaction-manager="transactionManager" 

                                       proxy-target-class="true"/>注入方式(cglib)

<!-- 启用@AspectJ风格的切面声明 --> <aop:aspectj-autoproxy proxy-target-class="true"/>,spring切面生成代理方式

 

 

 

而Spring的@Transactional背后,则是使用SpringAOP来对我们的UserDao进行了代理。代理的方式有2种,jdk代理或者cglib代理。

如UserDao的实例是我们要代理的对象,暂且称作target

jdk代理针对那些实现了相应的接口的类,创建出的代理对象也是实现了同样的接口,同时该代理对象包含一个target

cglib代理针对类都可以进行代理,创建出的代理对象是继承了target类,同时该代理对象内部包含一个target(既可以是接口,也可以是直接的类(无接口的类))

注意:proxy-target-class属性值决定是基于接口的还是基于类的代理被创建。如果proxy-target-class 属性值被设置为true,

那么基于类的代理将起作用(这时需要cglib库)。如果proxy-target-class属值被设置为false或者这个属性被省略,那么标准的JDK 基于接口的代理将起作用。

 

@Transactional放到接口上 基于JDK动态代理也是可以工作的。

基于JDK动态代理 ,可以将@Transactional放置在接口和具体类上。(方法)

基于CGLIB类代理,只能将@Transactional放置在具体类上。(方法)

 

因此 在实际开发时全部将@Transactional放到具体类上,而不是接口上。(方法)

 

 

 

代理于spring data 

 

spring jpa搭建遇到的问题如果使用的代理不是cglib,会导致运行报错,

Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class org.jasig.cas.services.DefaultServicesManagerImpl]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class org.jasig.cas.services.DefaultServicesManagerImpl

at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:212)

at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:109)

at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:447)

 

<aop:aspectj-autoproxy/>

<tx:annotation-driven transaction-manager="transactionManager"/>

上面这一套不行,用的是jdk

下面这套可以:

 

 

 

代理于注入方式:

 

jdk代理:

把实现类注入给接口,否则注入不成功,比如在shrio权限动态加载中写的注意

cglib代理,被注入的类不需要接口,即可注入

 

 

代理于缓存

spring cache 是基于aop代理的缓存,当我们配置的缓存是jdk那么他可放在接口也可放在实现类,当定义的是cglib的话只能的定义在接口,

当我们的dao(mapper)的实现是代理产产生的那么应该是应jdk,此时可以配置在service(实现类,接口上)(mapper实现类,接口上)@Cacheable

但是如果<context:component-scan base-package="com.esteel.web" />扫描的是粗粒度的所有包(不仅仅是controller),那么 @Cacheable 放到service层无效

,有时@Transactional事务也会失效,这是都只能放到dao(mapper)接口层(因为其实现类直接由代理生成的,生成时即织入成jvm 运行时bean),如果是放在service层,由于扫描粒度大

导致内部一些问题所以失效

 

分享到:
评论

相关推荐

    浅谈JDK动态代理与CGLIB代理去区别

    本篇文章将深入探讨JDK动态代理和CGLIB代理的区别,以及它们在实际应用中的选择。 首先,JDK动态代理主要依赖于java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类用于创建一个代理对象...

    java代理机制 JDK动态代理和cglib代理 详解

    本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...

    Spring框架中JDK动态代理和cglib动态代理

    Spring 框架中 JDK 动态代理和 CGLIB 动态代理是 Spring AOP 中一个非常重要的知识点。Spring AOP 框架会根据实际情况选择使用 JDK 的动态代理还是 CGLIB 的动态代理。 JDK 动态代理是 Java 自带的动态代理机制,它...

    JDK代理和Cglib代理

    JDK代理和Cglib代理是两种常用的动态代理实现方式。 **JDK代理(Java Dynamic Proxy)** JDK动态代理是Java标准库提供的一种代理机制,位于`java.lang.reflect`包下的`Proxy`类和`InvocationHandler`接口。JDK代理...

    JDK动态代理和CGLIB代理

    JDK动态代理和CGLIB代理是两种常用的实现方式。 首先,我们来看看JDK动态代理。JDK动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象...

    jdk 的动态代理和CGLIB代理

    jdk 的动态代理和CGLIB代理

    Jdk动态代理和cglib动态代理原理

    - **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...

    jdk与cglib动态度代理的区别原理

    主要存在两种常见的动态代理技术:JDK动态代理和CGLIB(Code Generation Library)动态代理。本文将深入探讨这两种技术的区别和原理。 **JDK动态代理**: JDK动态代理是Java标准库提供的一种代理机制,位于`java....

    java 动态代理实例(JDK代理与CGLIB代理)

    动态代理主要分为两种:JDK代理和CGLIB代理。 **JDK代理**是基于接口的代理,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。当我们的目标对象实现了特定的接口时,我们可以...

    AOP之JDK动态代理和CGLib动态代理

    Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...

    jdk和cglib动态代理的例子{jar包+源码}

    jdk和cglib动态代理的例子{jar包+源码} 解压:如有问题 用快压

    jdk与cglib动态代理与底层实现

    - **CGLIB代理**:CGLIB通过ASM生成一个继承自目标类的新类,这个新类覆盖了目标类的所有方法,并在这些方法内部调用拦截器链。在运行时,这个新类的实例作为代理对象。 5. **优缺点**: - JDK代理简单易用,但...

    JAVA JDK静态代理、动态代理、CGlib代理的代码演示

    CGlib代理通过继承目标类并覆写其方法来实现,因此即使目标类没有接口也可以进行代理。 总结来说,JDK静态代理适用于目标类实现了接口的情况,而动态代理和CGlib则更灵活,可以处理无接口的目标类。动态代理更简洁...

    输出JDK和CGLib动态代理产生的class文件.zip

    2. CGLib代理项目: - src/main/java:包含目标类 - target/classes:编译后的class文件,包括目标类的class文件,以及由CGLib生成的子类class文件 - 测试代码:展示如何使用Enhancer创建代理对象并调用方法 这...

    Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    在Java中,我们可以使用JDK自带的动态代理或者第三方库如CGLIB、Javassist、ASM来实现。 **JDK动态代理**: JDK的动态代理主要依赖于`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`两个类。...

    jdk动态代理和CGlib动态代理

    JDK动态代理和CGlib动态代理是Java中实现这一目标的两种主要方式。 ### JDK动态代理 JDK动态代理基于Java的接口实现。如果一个类实现了至少一个接口,我们就可以为这个类创建一个动态代理。动态代理通过`java.lang....

    JDK和CGlib分别实现的动态代理源代码

    JDK和CGlib是两种常用的动态代理实现方式,它们各自有不同的特性和使用场景。 首先,我们来详细了解一下JDK动态代理。JDK动态代理基于接口实现,它要求被代理的对象必须实现至少一个接口。通过`java.lang.reflect....

    Java JDK代理、CGLIB、AspectJ代理分析比较

    接下来将详细介绍三种常用的Java代理技术:JDK代理、CGLIB代理以及AspectJ代理,并对比它们各自的优缺点。 #### 二、静态代理实例 静态代理可以通过下面的例子进行说明: ```java public interface Calculator { ...

    jdk动态代理 cglib3.0动态代理

    JDK和CGLIB是两种常用的实现Java动态代理的方式。本文将深入探讨这两个库以及它们的工作原理。 **JDK动态代理** JDK动态代理基于Java反射API实现,它提供了`java.lang.reflect.Proxy`类和`java.lang.reflect....

    cglib代理模式要使用的相关jar包

    以上就是CGLIB代理模式的基本原理和使用方法。CGLIB的动态代理在很多场景下都非常实用,例如在AOP框架中拦截方法执行,进行日志记录、性能监控、事务管理等。然而,由于CGLIB是基于继承的,所以如果目标类为final...

Global site tag (gtag.js) - Google Analytics