`
mamaoyuan625
  • 浏览: 177254 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

spring中CGLIB代理(CGLIB字节码)

阅读更多

spring对AOP的支持-----知识点:

JDK的动态代理:主要是针对实现了接口的类生成代理 

CGLIB:是针对类生成代理,针对指定的类生成一个子类,覆盖里面的方法,所以指定的类不能是final包括方法

实例:目标对象

package com.lovo.spring;
 
public class UserManagerImpl {

	public void addUser(String username, String password) {
			System.out.println("---------userManagerImpl.addUser()--------");
	}

	public void deleteUser(int id) {
		System.out.println("---------userManagerImpl.deleteUser()--------");

	}

	public String findUserById(int id) {
	System.out.println("---------userManagerImpl.findUser()--------");
		return null;
	}

	public void modifyUser(int id, String username, String password) {
	System.out.println("---------userManagerImpl.modifyUser()--------");

	}
//private void checkSecurity(){
//	System.out.println("---------userManagerImpl.checkSecurity()--------");
//}
}

 代理对象:

package com.lovo.spring;

import org.aspectj.lang.JoinPoint;



public class SecurityHandler {

	private void checkSecurity(){

		System.out.println("---------------------------checkSecurity222222222222222");
	
	
	}

}

 

applicationContext.xml配置文件:

<!--  	可以不配置:spring会用到CGLIB库,但是必须导入库

<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
-->
	<bean id="securityHandler" clss="com.lovo.spring.SecurityHandler"/>           
	
	<bean id="userManager" class="com.lovo.spring.UserManagerImpl"/>
<aop:config>
	<aop:aspect id="myAspect" ref="securityHandler">
			<aop:pointcut id="allAddMethod" expression="execution(* com.lovo.spring.UserManagerImpl.add*(..))"/>
			<aop:before method="checkSecurity" pointcut-ref="allAddMethod"/>
	</aop:aspect>

</aop:config>

 1:如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP

2:目标对象实现了接口,可以强制使用CGLIB实现AOP

3:如目标对象没有实现接口,必须采用CGLIB库,spirng会自动在JDK动态代理和CGLIB之间转换

测试类:

package com.lovo.spring;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ClientTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	/**1111*/BeanFactory bf = new ClassPathXmlApplicationContext("applicationContext.xml");
	UserManagerImpl userManager =  (UserManagerImpl) bf.getBean("userManager");
		userManager.addUser("aa", "aa");
//		userManager.deleteUser(2);
	
	}

}

 

在这里:可以在111处采用断点:可以看到userManager对象是一个CGLIB代理,

userManagerImp1$$EnhancerByCGLIB$$..........

如果是实现了接口的JDK动态代理的话:

这里的userManager就是:$Proxy0

分享到:
评论
3 楼 ganbo 2014-12-14  
2 楼 zw_6234336 2013-05-03  
1 楼 znfsky 2013-03-12  
看了那么多博客,还是你这篇讲的最简单

相关推荐

    简单模拟spring cglib代理

    CGLIB能够为没有接口的类生成子类,在Spring框架中,当需要为一个没有接口的类创建代理对象时,会选择CGLIB来生成代理。 现在,我们来详细探讨如何简单模拟Spring框架中的CGLIB代理。要进行模拟,首先需要了解CGLIB...

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.ja及ck-2.5.1.jar

    CGLIB通过字节码操作技术,在运行时动态创建子类并增强方法。在Spring中,当目标对象不支持代理(如final类)或者没有接口时,Spring会使用CGLIB来生成代理对象,实现对目标对象的拦截和增强。"spring-cglib-repack-...

    spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.5.1.jar

    CGLIB通过字节码操作技术生成代理类,这样就可以在运行时扩展或修改已有类的功能,而无需修改原始代码。 CGLIB的主要优点包括: 1. 高性能:相对于其他动态代理库(如Java的反射API或JDK动态代理),CGLIB的代理...

    spring-cglib-repack-3.2.5.jar和spring-objenesis-repack-2.6.jar

    CGLIB通过字节码生成技术,为原始类创建一个子类,并在子类中拦截方法调用,实现事务管理、日志记录、性能监控等切面功能。3.2.5是CGLIB的一个版本号,表明这是CGLIB库的第3.2.5次更新,包含了之前版本的改进和修复...

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

    CGLIB 动态代理使用 ASM 字节码工具来生成代理类。CGLIB 动态代理可以代理没有接口的类,這是因为 CGLIB 动态代理可以生成一个原类的子类,然后 override 原类的方法来实现代理。 在 Spring AOP 框架中,默认情况下...

    spring-cglib-repack 资源

    CGLIB通过字节码技术生成代理类,可以在运行时动态扩展目标类并添加新的方法或属性。`spring-cglib-repack-3.2.6.jar`是Spring框架使用的CGLIB库的打包版本,可能包含了针对某些特定环境或冲突的修复。 其次,`...

    spring-cglib-repack-3.1.jar,spring-objenesis-repack-2.1.jar

    Objenesis通过使用字节码技术绕过Java的常规构造器,实现对类的快速实例化,这对于Spring框架中的某些功能,如测试和模拟,非常有用。 这两个jar包在Spring 4.0中作为依赖项存在,是因为Spring框架广泛地利用了动态...

    Spring源码缺失的spring-cglib-repack-3.2.6.jar和spring-objenesis-repack-2.6.jar

    CGlib通过字节码技术动态生成一个类的子类,这个子类会在运行时被实例化,从而实现对目标对象的代理。CGlib的核心组件包括Enhancer、Callback和MethodInterceptor等,它们协同工作,使得Spring可以在不修改原有代码...

    spring高版本源码分析缺lib spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.4.jar

    CGLIB通过字节码技术生成子类并在运行时增强目标类的功能,这对于AOP代理和Mock测试非常有用。因此,在分析Spring源码时,理解CGLIB的工作原理有助于深入理解Spring AOP的实现。 其次,"spring-objenesis-repack-...

    spring-cglib-repack-3.2.0.jar和spring-objenesis-2.2.jar

    为了深入理解Spring框架如何使用CGLIB和Objenesis,开发者通常会查看源代码,了解它们如何集成到Spring的AOP代理机制中,以及如何通过API进行定制。 总的来说,"spring-cglib-repack-3.2.0.jar"和"spring-objenesis...

    spring-cglib-repack-3.2.5.jar spring-objenesis-repack-2.6.jar spring依赖包

    当Spring的AOP代理无法通过简单地继承来实现时(例如,目标类为final或包含final方法),CGlib就会介入,通过字节码技术生成目标类的一个子类,以此来实现对目标方法的拦截和增强。CGlib的核心是ASM库,ASM是一个...

    Spring源码编译缺少的两个包:spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.2.jar

    CGLIB通过字节码技术生成一个目标类的子类,并在子类中拦截方法调用,实现代理逻辑。spring-cglib-repack-3.2.0.jar是CGLIB的一个打包版本,用于Spring源码编译,确保了AOP功能的正常实现。 2. **Objenesis** ...

    spring 3.x 需要的jar包 spring-cglib-repack-3.1.jar

    CGLIB的运作原理是通过字节码技术在运行时动态生成一个新的类,这个新类继承自原来的类,并且在新类中添加了额外的方法以实现对目标类的拦截。当Spring的AOP需要为目标对象创建代理时,如果目标类没有实现接口,...

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

    CGLIB的代理对象比JDK动态代理稍微慢一些,因为它涉及到字节码生成,但它的灵活性更高。 在性能方面,JDK动态代理由于不涉及字节码生成,所以在运行时的性能通常优于CGLIB。然而,如果目标类的方法很多,CGLIB可能...

    spring-cglib-repack-3.2.2.jar和spring-objenesis-repack-2.2.jar

    在Spring中,Objenesis用于初始化无参构造器的对象,特别是在CGLIB生成的代理类中,可能需要避免调用默认构造器,这时候Objenesis就能发挥作用。Objenesis能够优化实例化过程,对于某些不支持无参构造函数或构造函数...

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

    CGLIB通过字节码技术生成代理类,能够在运行时动态创建子类并扩展目标对象,从而实现代理功能。这种代理方式相对于Java自带的JDK动态代理(基于接口的代理)来说,对目标类没有接口限制,更具有灵活性。 要使用...

    Spring源码导入Eclipse缺失Jar包spring-asm-repack-5.0.4+spring-cglib-repack-3.1

    Spring框架在运行时对字节码进行操作,以实现AOP(面向切面编程)功能,比如代理、方法增强等。ASM库的repack版本是为了避免与应用中可能存在的其他ASM版本冲突,确保Spring的正常工作。 其次,CGLIB(Code ...

    3.2版本Spring源码需要源码所需要的jar:spring-asm-repack-5.0.4.jar,spring-cglib-repack-3.1.jar

    在Spring中,ASM主要用于AOP(面向切面编程)的实现,通过字节码操作,Spring可以在运行时动态生成代理类,以实现在不修改原有代码的情况下插入切面逻辑。spring-asm-repack-5.0.4.jar是ASM库的一个特定版本,与...

    CGLib代理jar包

    CGLib的核心是通过ASM库来操作字节码生成新的类,这些新生成的类是对原始类的扩展,通常用于在运行时动态创建目标对象的代理,以实现额外的功能,如AOP(面向切面编程)中的方法拦截。ASM库是一个底层的Java字节码...

    Spring cglib 中文说明

    因此,在实际开发中通常建议使用像 CGLIB 这样的高级抽象层,以简化字节码操作的过程。 #### 图1: CGLIB 库及其与其他框架的关系 该图展示了 CGLIB 库与一些流行的框架之间的关系,包括但不限于 Spring AOP 和 ...

Global site tag (gtag.js) - Google Analytics