`
xieyan30
  • 浏览: 49152 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

spring AOP (6) 基础知识-cglib代理

 
阅读更多

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织入横切逻辑的。

0
1
分享到:
评论

相关推荐

    spring 4.* 缺少jar spring-cglib-repack-3.2.5.jar_spring-objenesis-repack-2.6.jar

    在Spring框架4.*版本中,可能会遇到一个常见问题,即缺少`spring-cglib-repack-3.2.5.jar`和`spring-objenesis-repack-2.6.jar`这两个jar...了解这些基础知识对于理解和优化Spring应用的性能、处理相关问题都非常重要。

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    了解这些基础知识可以帮助我们更好地掌握 Spring AOP 的实现细节。在分析源码时,可以参考作者的源码注释和相关文章,以便更深入地理解每一步操作。 总的来说,Spring AOP 通过动态代理技术实现了切面的插入,使得...

    spring aop的jar包

    Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。前者基于接口,适用于有接口的目标对象;后者通过字节码技术创建子类,适用于无接口或不希望修改原有代码的情况。 在实际应用中,开发者通常通过XML配置或...

    spring-aop-aspectj-case

    1. **Spring AOP基础**: - **代理模式**:Spring AOP基于动态代理实现,可以创建JDK动态代理或CGLIB代理,为目标对象提供增强功能。 - **通知(Advice)**:包括前置通知、后置通知、异常通知、环绕通知等,定义...

    springAOP配置动态代理实现

    一、Spring AOP基础知识 1. **什么是AOP**:AOP是一种编程范式,用于处理系统中的横切关注点,即那些跨越多个类或方法的共同功能,如事务管理、日志记录等。AOP通过切面(Aspect)将这些关注点与业务逻辑分离,提高...

    spring AOP 引入jar包,spring IOC 引入Jar包

    5. **代理(Proxy)**:Spring AOP 使用动态代理技术创建对象,有两种代理方式:JDK 动态代理和 CGLIB 代理。前者适用于接口实现类,后者适用于没有接口的类。 6. **注解使用**:如 @Aspect、@Before、@After、@...

    spring aop所需jar包

    - **代理模式**:Spring支持两种代理,JDK动态代理和CGLIB代理。JDK代理适用于实现了接口的类,而CGLIB代理则用于没有实现接口的类。 - **注解驱动的AOP**:通过在类或方法上使用特定的注解(如`@Aspect`, `@...

    spring AOP入门教程

    本教程将带你了解Spring AOP的基础知识,帮助你入门这一强大技术。 ### 一、什么是AOP AOP是一种编程范式,旨在解决程序中的横切关注点问题,这些关注点通常与业务逻辑无关,但又需要在多个地方被调用,如日志记录...

    jar包---Spring AOP 还需.rar

    1. **Spring AOP的实现方式**:Spring AOP支持两种代理模式,即JDK动态代理和CGLIB代理。JDK代理用于实现接口的类,而CGLIB代理则用于没有实现接口的类。CGLIB是一个代码生成库,Spring在目标类上创建一个子类,并在...

    Spring AOP源码笔记

    Spring AOP基础** - **切⾯编程**: AOP允许开发者将横切关注点(如日志、事务、安全性等)定义为独立的模块,称为切面。切面可以包含通知(advice)、切入点(pointcut)和其他元数据。 - **通知(Advice)**: 通知...

    SpringAOP.zip

    Spring AOP,全称为Aspect Oriented Programming,是Spring框架中的一个重要模块,主要负责处理系统中的...文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从基础概念到进阶实践的详细讲解。

    Spring之使用AOP缘由(5-回顾)

    了解了这些基础知识,我们可以通过以下几个步骤在Spring中使用AOP: 1. 定义切面:创建一个类,并使用`@Aspect`注解标记为切面。 2. 定义切点:在切面类中,使用`@Pointcut`定义切点表达式。 3. 编写通知:使用`@...

    Spring-AOP .pptx

    - Spring AOP通过动态代理技术在运行时织入增强代码,采用JDK动态代理或CGLib动态代理两种机制。 - 动态代理是AOP的核心,它规范化了如何在不修改原有代码的情况下插入横切逻辑。 5. **动态代理** - JDK动态代理...

    简单Spring框架模拟器--Demo

    最后,“tiny-spring-step-10-invite-cglib-and-aopproxy-factory (1).zip”引入了CGLIB库,当无法使用JDK动态代理时,CGLIB作为另一种创建代理的方式。这一步骤会解释CGLIB的工作原理,以及如何与Spring的AOPProxy...

    SpringAOP简单项目实现

    总结,这个"SpringAOP简单项目实现"涵盖了Spring AOP的基础知识,包括切面、通知、切入点的定义与配置,以及如何在实际项目中使用Maven进行构建和依赖管理。对于初学者来说,这是一个很好的实践案例,能够帮助他们...

    代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)与SpringAOP的3种配置方式案例工程代码

    本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...

    Spring AOP面向切面三种实现

    Spring AOP的基础是动态代理,它可以创建目标对象的代理对象来实现切面功能。有两种代理方式:JDK动态代理和CGLIB代理。JDK动态代理适用于接口实现类,它通过反射机制在运行时生成实现了目标接口的代理类;而CGLIB...

    使用gradle构建Spring源码工程需要的Spring-chlib-repack-3.2

    2. **spring-cglib-repack-3.2.0.jar**:CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,用于在运行期动态扩展Java类与实现Java接口。Spring在没有Java代理的情况下,使用CGLIB创建AOP代理。这里...

    初探spring aop内部实现 java

    而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在方法调用前后插入切面逻辑。 接下来,我们转向DataSource的实现。在Spring中,DataSource是用于存储和管理数据库连接的...

    spring-aop.jar

    本文将围绕"spring-aop.jar"这一核心组件,深入探讨Spring AOP的相关知识点。 "spring-aop.jar"是Spring框架中负责实现AOP功能的库文件,包含了Spring对AOP的支持和实现。当我们在项目中引入这个jar包,就可以利用...

Global site tag (gtag.js) - Google Analytics