`

十一 使用CGLIB实现AOP功能与AOP概念解释

 
阅读更多
十一 使用CGLIB实现AOP功能与AOP概念解释

前面的proxy技术必须在类实现了接口的前提下才可以实现权限的控制,cglb可以在类不实现接口的情况下完成。

在spring文件夹下lib/cglib下找到cglib的jar库文件,加入工程。

CGlibProxyFactory.java

view plaincopy to clipboardprint?
01.package cn.pf.aop;   
02.  
03.import java.lang.reflect.Method;   
04.  
05.import cn.pf.aop.service.impl.PersonServiceBean;   
06.  
07.import net.sf.cglib.proxy.Enhancer;   
08.import net.sf.cglib.proxy.MethodInterceptor;   
09.import net.sf.cglib.proxy.MethodProxy;   
10.  
11.public class CGlibProxyFactory implements MethodInterceptor{   
12.    private Object targetObject;   
13.       
14.    public Object createProxyIntance(Object targetObject){   
15.        this.targetObject = targetObject;   
16.        Enhancer enhancer = new Enhancer();   
17.        enhancer.setSuperclass(this.targetObject.getClass());   
18.        enhancer.setCallback(this);   
19.        return enhancer.create();   
20.    }   
21.  
22.    @Override  
23.    public Object intercept(Object proxy, Method method, Object[] arg2,   
24.            MethodProxy arg3) throws Throwable {   
25.        PersonServiceBean personServiceBean = (PersonServiceBean)targetObject;   
26.        Object result = null;   
27.        if(personServiceBean.getUser() != null){   
28.            result = method.invoke(targetObject, arg2);   
29.        }   
30.        return result;   
31.    }   
32.}  
package cn.pf.aop;

import java.lang.reflect.Method;

import cn.pf.aop.service.impl.PersonServiceBean;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CGlibProxyFactory implements MethodInterceptor{
	private Object targetObject;
	
	public Object createProxyIntance(Object targetObject){
		this.targetObject = targetObject;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(this.targetObject.getClass());
		enhancer.setCallback(this);
		return enhancer.create();
	}

	@Override
	public Object intercept(Object proxy, Method method, Object[] arg2,
			MethodProxy arg3) throws Throwable {
		PersonServiceBean personServiceBean = (PersonServiceBean)targetObject;
		Object result = null;
		if(personServiceBean.getUser() != null){
			result = method.invoke(targetObject, arg2);
		}
		return result;
	}
}
 

AOPTest.java

view plaincopy to clipboardprint?
01.@Test public void proxyTest2(){   
02.        CGlibProxyFactory factory = new CGlibProxyFactory();   
03.        PersonServiceBean personServiceBean = (PersonServiceBean) factory.createProxyIntance(new PersonServiceBean("1"));   
04.        personServiceBean.save("111");   
05.    }  
@Test public void proxyTest2(){
		CGlibProxyFactory factory = new CGlibProxyFactory();
		PersonServiceBean personServiceBean = (PersonServiceBean) factory.createProxyIntance(new PersonServiceBean("1"));
		personServiceBean.save("111");
	} 

CGlib的enhance继承了目标类所有非final方法,对这些方法进行覆盖。创建的代理对象是目标对象的子类


完毕 end!

 

分享到:
评论

相关推荐

    AOP使用CGLIB实现AOP功能

    Spring AOP实现方法之一:CGLIB 实现AOP功能

    使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能

    本篇将深入探讨如何使用JDK的动态代理和CGLIB库来实现Spring中的AOP功能。 首先,我们来看JDK中的Proxy技术。JDK Proxy是Java提供的一种动态代理机制,它允许我们在运行时创建一个实现了特定接口的新类。这个新类...

    Spring学习笔记(14)----使用CGLIB实现AOP功能

    在本篇Spring学习笔记中,我们将探讨如何使用CGLIB库来实现AOP功能。 CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它被广泛用于动态代理和运行时织入AOP切面。在Spring中,如果目标类没有...

    JavaEE CGLIB字节码增强方式实现AOP编程

    总的来说,JavaEE CGLIB字节码增强方式提供了一种灵活的手段来实现AOP编程,它通过动态生成字节码创建目标类的子类,实现了对目标方法的拦截和增强,从而在不修改原有代码的基础上,增强了代码的功能和可维护性。...

    基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)

    基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)...

    spring_aop_cglib的实现方式

    下面我们将深入探讨Spring AOP如何利用CGLIB以及CGLIB的相关概念。 首先,Spring AOP的核心是通过代理来实现切面功能。代理可以分为两种类型:基于接口的JDK动态代理和基于类的CGLIB代理。JDK动态代理要求目标对象...

    cglib aop spring 动态代理

    静态代理--不适合企业开发,适合初学者理解代理。 jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口...spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib

    spring_aop4.rar_Home Home_jar 转换_spring AOP jar

    2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用CGLIB实现AOP? * 添加CGLIB库,SPRING_HOME/...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    Spring框架中的AOP模块使用了动态代理来实现AOP概念。Spring AOP允许开发者定义切面,并在这些切面中指定拦截的方法。Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,...

    springAop.rar_AOP java_cglib_spring aop

    CGLIB是一个强大的高性能的代码生成库,它在许多AOP的实现中被用到,比如Spring AOP。CGLIB使用字节码技术为一个类创建子类,并在子类中拦截方法调用,从而实现代理。CGLIB生成的子类是动态的,因此在编译时并不存在...

    AOP-CGLIB学习-实现简单的注解权限系统

    标题中的"AOP-CGLIB学习-实现简单的注解权限系统"指的是使用Spring的面向切面编程(AOP)特性,结合CGLIB库来创建一个基于注解的权限控制系统。在这个系统中,通过CGLIB动态代理技术,可以对带有特定注解的方法进行...

    Xml配置实现AOP

    在XML配置中,我们需要定义`<aop:config>`标签来开启AOP功能,然后使用`<aop:aspect>`定义切面,`<aop:before>`、`<aop:after>`、`<aop:around>`等标签定义通知(advice),最后通过`<aop:pointcut>`定义切入点...

    AOP、CGLIB

    在Spring AOP中,CGLIB被用来创建代理对象,当目标对象没有实现接口时,Spring会使用CGLIB来动态生成子类,以此实现对目标对象的代理。CGLIB的使用避免了反射带来的性能损失,提高了代理效率。 CGLIB的工作原理: ...

    实现AOP功能的jar包

    在Java领域,Spring框架是实现AOP功能的重要工具,它允许开发者定义“切面”来封装横切关注点,如日志、事务管理等,从而将这些通用功能与核心业务逻辑分离。 1. **Spring AOP**: Spring AOP是Spring框架的一部分,...

    使用代理实现简易的spring aop功能

    在这个例子中,我们将探讨如何使用动态代理来实现一个简单的Spring AOP功能。 动态代理是Java提供的一种机制,它允许我们在运行时创建对象的代理,该对象可以代表原对象执行额外的操作。在Spring AOP中,有两种主要...

    Java实现aop案例

    8. **使用代理**:解释JDK动态代理和CGLIB代理的区别,以及Spring如何根据目标类是否实现了接口来选择合适的代理方式。 9. **配置AOP**:介绍如何在Spring的XML配置文件或Java配置中启用AOP,并声明切面。 10. **...

    spring学习之五“AOP概念及使用Annotation的实现”

    AOP为开发者提供了在不修改源代码的情况下,对程序进行功能增强的能力,使得我们可以更方便地处理如日志记录、事务管理、权限控制等横切关注点。 首先,我们来理解一下AOP的基本概念。AOP的核心是切面(Aspect)和...

    AOP之JDK动态代理和CGLib动态代理

    在Java世界中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种设计模式,它允许程序员在不修改源代码的情况下,插入新的行为或增强已有功能。Spring框架是AOP实现的一个典范,它提供了两种主要的动态...

    42 离开Spring AOP,我们如何实现AOP功能?慕课专栏1

    总结来说,当我们无法使用Spring AOP时,可以借助JDK动态代理或者CGLIB来实现AOP功能。这要求我们对代理模式有深入理解,并能熟练运用反射API。通过这种方式,我们可以在任何框架或环境中实现类似Spring AOP的功能,...

    Spring aop 基于schema的AOP支持及JoinPoint的使用、如何使用CGLIB代理

    Spring AOP在默认情况下,对于没有实现接口的类,会使用CGLIB库生成代理对象。CGLIB是一个强大的代码生成库,可以在运行时动态生成子类,从而实现对目标对象的代理。 1. **CGLIB工作原理** - CGLIB通过继承目标类...

Global site tag (gtag.js) - Google Analytics