`
lochen514
  • 浏览: 10506 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

简单模拟spring cglib代理

阅读更多
spring使用了两种代理模式,一种是jdk动态代理,另有一种就是我下面将要还原的cglib代理。在这里我向大家推荐一个具体分析jdk动态代理和cglib的区别和优缺点的博客:http://hbzwt.iteye.com/blog/909147,具体大家可以参照他写的,个人感觉写的蛮好。
在这里我给大家做一个形象的比喻来解释代理,一个女明星要接业务或特殊服务,都是通过她的经纪人来联系,至于价格多少,有些什么服务等等具体操作细节是经济人与客户谈,到这个女明星身上他只要做他本来只能做的东西,其他联系谈判什么的都是经济人在一手处理,所以这个经纪人就相当于一个代理。在java中也是一样!AccountDao交给cglib代理以后那些事前通知,时候通知,环通知都是由代理做的,AccountDao只需要做简单的操作,想相当于女明星只要演戏,唱歌,和XX一样。
说明下:MethodInterceptor接口是spring所带的jar包中的一个的一个接口
首先介绍下这些个类吧。
1,Log类,事后通知,即为做日志。
public class Log {
	
	public void doLog(){
		System.out.println("做日志");
	}

}

2,Security类,事前通知,即为业务做分析判断
public class Security {

	public void doCheck(){
		System.out.println("做检查");
	}
}

3,Transcation类,环通知,即配置事物
public class Transcation {
	
	public void beginTransacation(){
		System.out.println("开启事务");
	}
	
	public void closeTransacation(){
		System.out.println("关闭事务");
	}
}

4,CGLIBProxy代理类
public class CGLIBProxy implements MethodInterceptor {
	
	private Object targetObject;//代理的目标对象	
	
	public Object createProxyInstance(Object targetObject){
		this.targetObject = targetObject;
		Enhancer enhancer = new Enhancer();//该类用于生成代理对象
		enhancer.setSuperclass(this.targetObject.getClass());//设置父类
		enhancer.setCallback(this);//设置回调用对象为本身
		return enhancer.create();
	}
	
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		
		Log log=new Log();//事后通知
		Security security=new Security();//事前通知
		Transcation tx=new Transcation();//环通知
		security.doCheck();
		tx.beginTransacation();
		Object obj=methodProxy.invoke(this.targetObject, args);
		tx.closeTransacation();
		log.doLog();
		return obj;
		
	}
	
}

5,dao层类
public class AccountDao {
	
	public void add(){
		System.out.println("insert into ....");
	}
	
	public void delete(){
		System.out.println("delete ......");
	}

}

6,测试类
public class Test {
	
	public static void main(String[] args) {
		 AccountDao dao=new AccountDao();
		 
		 AccountDao proxy=(AccountDao)new CGLIBProxy().createProxyInstance(dao);
		 
		 proxy.add();
		 
	}

}
分享到:
评论

相关推荐

    使用CGLIB模拟spring的拦截器

    在本教程中,我们将深入探讨如何使用CGLIB库来模拟Spring的拦截器功能。 CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)框架中被广泛应用,包括Spring AOP。当...

    spring-cglib-repack-3.2.6.jar,spring-objenesis-repack-2.6.jarspring-cglib-repack

    当目标对象不支持接口或者为了提高性能时,Spring会使用CGLIB代理来创建代理对象。`spring-cglib-repack-3.2.6.jar` 包含了CGLIB库的重新打包版本,可能包含了针对Spring框架优化的特定实现,确保与Spring的其他组件...

    spring源码编译缺少的cglib和objenesis包

    Objenesis常用于测试框架和模拟库中,Spring也利用它在某些情况下快速实例化对象,特别是与代理相关的场景。 现在,回到问题的核心:"spring源码编译缺少的cglib和objenesis包"。这意味着在尝试编译Spring源码时,...

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

    当Spring需要为目标对象创建代理以便实现方法拦截时,如果目标类没有实现接口,CGLIB就会派上用场,生成一个该类的子类,然后在子类中插入拦截逻辑。这样,我们可以在不修改原有代码的情况下,通过AOP来增强或监控...

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

    当目标对象不支持接口或者需要更高效的代理方式时,Spring会使用CGLIB生成目标对象的子类,然后在子类中拦截方法调用,从而实现切面逻辑。CGLIB的3.2.0版本可能包含了一些性能优化和bug修复。 2. **Objenesis**:...

    以注解方式模拟Spring IoC AOP

    模拟Spring的IoC,我们可以创建一个简单的容器类,其中包含一个Map来存储bean。然后使用注解处理器扫描带有特定注解(如`@Component`)的类,并将它们注册到容器中。当需要注入依赖时,容器可以解析注解并自动装配。...

    spring4源码所需要的spring-objenesis-repack-2.1.jar,spring-cglib-repack-3.1.jar

    在Spring AOP中,CGLIB被用来为没有接口的目标类生成代理类。当Spring检测到一个类没有实现任何接口时,它会使用CGLIB来创建一个子类,并在其中插入拦截器方法以实现切面功能。CGLIB还用于其他场景,如动态数据访问...

    cglib动态代理介绍

    **正文** CGlib是Java开发中一个非常重要的库,它是一个强大的、高性能的代码生成库,主要用于创建子类,...同时,对于熟悉Spring AOP的朋友,要知道Spring在没有接口的情况下,内部就是使用CGlib来实现AOP代理的。

    自己动手模拟spring

    8. **代理模式**:在实现AOP时,我们需要了解和使用代理模式,如JDK动态代理和CGLIB代理,来在运行时创建代理对象以实现切面逻辑。 通过这个模拟过程,我们可以深入理解Spring框架的工作原理,同时也能提升自己的...

    转载:cglib动态代理介绍(一)

    - 如果目标类中包含静态方法,CGlib代理不会影响静态方法的行为。 总结,CGlib是一个强大且灵活的工具,它通过字节码生成技术实现了对Java类的动态代理,尤其在没有接口约束或者性能要求高的情况下,它是Java开发者...

    通过动态代理模拟Spring AOP

    总的来说,通过Java的动态代理模拟Spring AOP可以帮助我们理解AOP的基本原理,并在实际项目中实现一些简单的切面逻辑。然而,对于更复杂的需求,如跨越多个方法的事务管理,Spring AOP提供了更全面的解决方案。熟悉...

    cglib动态代理

    7. **应用场景**:CGLib常用于AOP框架中,例如在Spring AOP中,它作为JDK动态代理的补充,用于处理没有实现接口的类。此外,在单元测试中,CGLib可以用来模拟复杂对象,使测试更加灵活。 8. **性能对比**:相对于...

    个人用java动态代理模拟实现spring aop

    在本主题中,我们将探讨如何使用Java动态代理来模拟实现Spring AOP的功能。 首先,我们需要了解Java中的两种动态代理机制:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于目标对象实现了接口的情况...

    动态代理cglibjar包和源码

    CGLIB(Code Generation Library)是Java中一个高性能的代码生成库,常用于实现动态代理,尤其在Spring框架中被广泛应用。本文将深入探讨CGLIB的工作原理、使用方式以及源码分析。 CGLIB是一个强大的高性能的代码...

    Spring AOP简单模拟

    有JDK动态代理和CGLIB代理两种方式,前者针对接口,后者针对类。 接下来,我们将模拟实现Spring AOP: 1. **定义切面**:创建一个类,声明切面并定义通知。例如,我们可以创建一个`LoggingAspect`类,其中包含一个...

    Spring模拟aop静态代理案例

    本案例"Spring模拟aop静态代理案例"旨在帮助开发者深入理解Spring AOP在实际应用中的运作方式,特别是静态代理的概念。 AOP(Aspect Oriented Programming)是一种编程范式,它允许程序员将关注点(如日志、事务...

    CGlib动态代理类所需的jar包

    CGlib是实现动态代理的一种方式,尤其是在Spring框架中,它被用于AOP(面向切面编程)来创建代理对象。 CGLib库主要包含以下几个核心组件: 1. **cglib-nodep**: 这个jar包是CGlib的主要库,它包含了生成和操作...

    cglib实现动态代理依赖jar包

    3. **模拟接口**:对于没有接口的类,CGLib可以提供一种代理机制,使得我们仍然可以利用面向切面编程的便利性。 **CGLib的工作原理**: CGLib会为目标类创建一个子类,并在子类中拦截父类的方法调用。这个过程包括...

    模拟 Spring 的实现

    模拟Spring并不是重新创建一个完整的Spring框架,而是为了学习和理解Spring的工作原理,通过编写简单的代码来实现IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)的核心...

Global site tag (gtag.js) - Google Analytics