JDK的动态代理只能针对接口来实现,由Proxy.newProxyInstance()第二个参数能很清楚地意识到这一点。面向接口编程肯定有它自己的好处,但是如果很小很小的一个项目,我们要对每个业务类创建一个接口,也并不一定是件好事吧。
如果不创建接口,而要实现代理,我们需要用到cglib,它是一个第三方的jar包,需要额外导入。
cglib采用非常底层的字节码技术,可以为代理对象创建一个子类,并且在子类中采用方法拦截的技术,拦截所有父类方法的调用,并且织入横切逻辑。
注意,既然是为父类创建一个子类,那么final修饰的方法是不能继承的,所以final修饰的方法是不会被织入横切逻辑的。
目标类:
package spring3.aop.aop4; public class Target { public void do1() { System.out.println("Target.do1()"); } public void do2(String str) { System.out.println("Target.do2(" + str + ")"); } public void exe1() { System.out.println("Target.exe1()"); } public void exe2(String str) { System.out.println("Target.exe2(" + str + ")"); } public final void exe3() { System.out.println("Target.exe3"); } }
创建代理类 CglibProxy
package spring3.aop.aop4; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CglibProxy implements MethodInterceptor { private Enhancer enhancer = new Enhancer(); public Object getProxy(Class<?> cls) { // 设定被代理类(目标类) enhancer.setSuperclass(cls); // 实例化代理类 enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("----START----"); Object result = proxy.invokeSuper(obj, args); System.out.println("----END----"); return result; } }
测试类:
package spring3.aop.aop4; public class ProxyMain { public static void main(String[] args) { CglibProxy proxy = new CglibProxy(); Target childTarget = (Target) proxy.getProxy(Target.class); childTarget.do1(); childTarget.do2("test"); childTarget.exe1(); childTarget.exe2("test"); childTarget.exe3(); } }
测试结果:
----START---- Target.do1() ----END---- ----START---- Target.do2(test) ----END---- ----START---- Target.exe1() ----END---- ----START---- Target.exe2(test) ----END---- Target.exe3
这部分没有什么要讲的,大家知道就可以了。
注意,加载cglib时间比jdk的反射时间要长,如果应用中频繁的动态生成新的代理,不建议使用cglib,这个根据具体需求自己判断。
spring的aop是通过jdk动态代理或者cglib动态代理为目标bean织入横切逻辑的。
相关推荐
在Spring框架4.*版本中,可能会遇到一个常见问题,即缺少`spring-cglib-repack-3.2.5.jar`和`spring-objenesis-repack-2.6.jar`这两个jar...了解这些基础知识对于理解和优化Spring应用的性能、处理相关问题都非常重要。
了解这些基础知识可以帮助我们更好地掌握 Spring AOP 的实现细节。在分析源码时,可以参考作者的源码注释和相关文章,以便更深入地理解每一步操作。 总的来说,Spring AOP 通过动态代理技术实现了切面的插入,使得...
Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。前者基于接口,适用于有接口的目标对象;后者通过字节码技术创建子类,适用于无接口或不希望修改原有代码的情况。 在实际应用中,开发者通常通过XML配置或...
1. **Spring AOP基础**: - **代理模式**:Spring AOP基于动态代理实现,可以创建JDK动态代理或CGLIB代理,为目标对象提供增强功能。 - **通知(Advice)**:包括前置通知、后置通知、异常通知、环绕通知等,定义...
一、Spring AOP基础知识 1. **什么是AOP**:AOP是一种编程范式,用于处理系统中的横切关注点,即那些跨越多个类或方法的共同功能,如事务管理、日志记录等。AOP通过切面(Aspect)将这些关注点与业务逻辑分离,提高...
5. **代理(Proxy)**:Spring AOP 使用动态代理技术创建对象,有两种代理方式:JDK 动态代理和 CGLIB 代理。前者适用于接口实现类,后者适用于没有接口的类。 6. **注解使用**:如 @Aspect、@Before、@After、@...
- **代理模式**:Spring支持两种代理,JDK动态代理和CGLIB代理。JDK代理适用于实现了接口的类,而CGLIB代理则用于没有实现接口的类。 - **注解驱动的AOP**:通过在类或方法上使用特定的注解(如`@Aspect`, `@...
本教程将带你了解Spring AOP的基础知识,帮助你入门这一强大技术。 ### 一、什么是AOP AOP是一种编程范式,旨在解决程序中的横切关注点问题,这些关注点通常与业务逻辑无关,但又需要在多个地方被调用,如日志记录...
1. **Spring AOP的实现方式**:Spring AOP支持两种代理模式,即JDK动态代理和CGLIB代理。JDK代理用于实现接口的类,而CGLIB代理则用于没有实现接口的类。CGLIB是一个代码生成库,Spring在目标类上创建一个子类,并在...
Spring AOP基础** - **切⾯编程**: AOP允许开发者将横切关注点(如日志、事务、安全性等)定义为独立的模块,称为切面。切面可以包含通知(advice)、切入点(pointcut)和其他元数据。 - **通知(Advice)**: 通知...
Spring AOP,全称为Aspect Oriented Programming,是Spring框架中的一个重要模块,主要负责处理系统中的...文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从基础概念到进阶实践的详细讲解。
了解了这些基础知识,我们可以通过以下几个步骤在Spring中使用AOP: 1. 定义切面:创建一个类,并使用`@Aspect`注解标记为切面。 2. 定义切点:在切面类中,使用`@Pointcut`定义切点表达式。 3. 编写通知:使用`@...
- Spring AOP通过动态代理技术在运行时织入增强代码,采用JDK动态代理或CGLib动态代理两种机制。 - 动态代理是AOP的核心,它规范化了如何在不修改原有代码的情况下插入横切逻辑。 5. **动态代理** - JDK动态代理...
最后,“tiny-spring-step-10-invite-cglib-and-aopproxy-factory (1).zip”引入了CGLIB库,当无法使用JDK动态代理时,CGLIB作为另一种创建代理的方式。这一步骤会解释CGLIB的工作原理,以及如何与Spring的AOPProxy...
总结,这个"SpringAOP简单项目实现"涵盖了Spring AOP的基础知识,包括切面、通知、切入点的定义与配置,以及如何在实际项目中使用Maven进行构建和依赖管理。对于初学者来说,这是一个很好的实践案例,能够帮助他们...
本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...
Spring AOP的基础是动态代理,它可以创建目标对象的代理对象来实现切面功能。有两种代理方式:JDK动态代理和CGLIB代理。JDK动态代理适用于接口实现类,它通过反射机制在运行时生成实现了目标接口的代理类;而CGLIB...
2. **spring-cglib-repack-3.2.0.jar**:CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,用于在运行期动态扩展Java类与实现Java接口。Spring在没有Java代理的情况下,使用CGLIB创建AOP代理。这里...
而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在方法调用前后插入切面逻辑。 接下来,我们转向DataSource的实现。在Spring中,DataSource是用于存储和管理数据库连接的...
本文将围绕"spring-aop.jar"这一核心组件,深入探讨Spring AOP的相关知识点。 "spring-aop.jar"是Spring框架中负责实现AOP功能的库文件,包含了Spring对AOP的支持和实现。当我们在项目中引入这个jar包,就可以利用...