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(Code Generation Library)是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)框架中被广泛应用,包括Spring AOP。当...
当目标对象不支持接口或者为了提高性能时,Spring会使用CGLIB代理来创建代理对象。`spring-cglib-repack-3.2.6.jar` 包含了CGLIB库的重新打包版本,可能包含了针对Spring框架优化的特定实现,确保与Spring的其他组件...
Objenesis常用于测试框架和模拟库中,Spring也利用它在某些情况下快速实例化对象,特别是与代理相关的场景。 现在,回到问题的核心:"spring源码编译缺少的cglib和objenesis包"。这意味着在尝试编译Spring源码时,...
当Spring需要为目标对象创建代理以便实现方法拦截时,如果目标类没有实现接口,CGLIB就会派上用场,生成一个该类的子类,然后在子类中插入拦截逻辑。这样,我们可以在不修改原有代码的情况下,通过AOP来增强或监控...
当目标对象不支持接口或者需要更高效的代理方式时,Spring会使用CGLIB生成目标对象的子类,然后在子类中拦截方法调用,从而实现切面逻辑。CGLIB的3.2.0版本可能包含了一些性能优化和bug修复。 2. **Objenesis**:...
模拟Spring的IoC,我们可以创建一个简单的容器类,其中包含一个Map来存储bean。然后使用注解处理器扫描带有特定注解(如`@Component`)的类,并将它们注册到容器中。当需要注入依赖时,容器可以解析注解并自动装配。...
在Spring AOP中,CGLIB被用来为没有接口的目标类生成代理类。当Spring检测到一个类没有实现任何接口时,它会使用CGLIB来创建一个子类,并在其中插入拦截器方法以实现切面功能。CGLIB还用于其他场景,如动态数据访问...
**正文** CGlib是Java开发中一个非常重要的库,它是一个强大的、高性能的代码生成库,主要用于创建子类,...同时,对于熟悉Spring AOP的朋友,要知道Spring在没有接口的情况下,内部就是使用CGlib来实现AOP代理的。
8. **代理模式**:在实现AOP时,我们需要了解和使用代理模式,如JDK动态代理和CGLIB代理,来在运行时创建代理对象以实现切面逻辑。 通过这个模拟过程,我们可以深入理解Spring框架的工作原理,同时也能提升自己的...
- 如果目标类中包含静态方法,CGlib代理不会影响静态方法的行为。 总结,CGlib是一个强大且灵活的工具,它通过字节码生成技术实现了对Java类的动态代理,尤其在没有接口约束或者性能要求高的情况下,它是Java开发者...
总的来说,通过Java的动态代理模拟Spring AOP可以帮助我们理解AOP的基本原理,并在实际项目中实现一些简单的切面逻辑。然而,对于更复杂的需求,如跨越多个方法的事务管理,Spring AOP提供了更全面的解决方案。熟悉...
7. **应用场景**:CGLib常用于AOP框架中,例如在Spring AOP中,它作为JDK动态代理的补充,用于处理没有实现接口的类。此外,在单元测试中,CGLib可以用来模拟复杂对象,使测试更加灵活。 8. **性能对比**:相对于...
在本主题中,我们将探讨如何使用Java动态代理来模拟实现Spring AOP的功能。 首先,我们需要了解Java中的两种动态代理机制:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于目标对象实现了接口的情况...
CGLIB(Code Generation Library)是Java中一个高性能的代码生成库,常用于实现动态代理,尤其在Spring框架中被广泛应用。本文将深入探讨CGLIB的工作原理、使用方式以及源码分析。 CGLIB是一个强大的高性能的代码...
有JDK动态代理和CGLIB代理两种方式,前者针对接口,后者针对类。 接下来,我们将模拟实现Spring AOP: 1. **定义切面**:创建一个类,声明切面并定义通知。例如,我们可以创建一个`LoggingAspect`类,其中包含一个...
本案例"Spring模拟aop静态代理案例"旨在帮助开发者深入理解Spring AOP在实际应用中的运作方式,特别是静态代理的概念。 AOP(Aspect Oriented Programming)是一种编程范式,它允许程序员将关注点(如日志、事务...
CGlib是实现动态代理的一种方式,尤其是在Spring框架中,它被用于AOP(面向切面编程)来创建代理对象。 CGLib库主要包含以下几个核心组件: 1. **cglib-nodep**: 这个jar包是CGlib的主要库,它包含了生成和操作...
3. **模拟接口**:对于没有接口的类,CGLib可以提供一种代理机制,使得我们仍然可以利用面向切面编程的便利性。 **CGLib的工作原理**: CGLib会为目标类创建一个子类,并在子类中拦截父类的方法调用。这个过程包括...
模拟Spring并不是重新创建一个完整的Spring框架,而是为了学习和理解Spring的工作原理,通过编写简单的代码来实现IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)的核心...