`
freewxy
  • 浏览: 342665 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

 
阅读更多

 第三方创建代理对象的框架cglib,目标类可以不实现接口

cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
cglib封装了asm,可以在运行期动态生成新的class。
cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制

可以生成目标类的子类,并重写父类非final修饰符的方法

CGLib:http://www.blogjava.net/stone2083/archive/2008/03/16/186615.html

1、  创建被拦截对象,该对象没有实现接口:

package com.wxy.service.impl;

public class CopyOfPeopleServiceBean {

    private String user = null;

    public CopyOfPeopleServiceBean() {
    }

    public CopyOfPeopleServiceBean(String user) {
        this.setUser(user);
    }

    public String getPeopleName(Integer peopleId) {
        System.out.println("我是getPeopleName()方法");
        return "wxy";
    }

    public void save(String name) {
        System.out.println("我是save()方法,save:" + name);
    }

    public void update(String name, Integer peopleId) {
        System.out.println("我是update()方法");
    }

    /**
     * @param user the user to set
     */
    public void setUser(String user) {
        this.user = user;
    }

    /**
     * @return the user
     */
    public String getUser() {
        return user;
    }

}

 

2、  编写cglib代理工厂,实现代理功能:

package com.wxy.aop;

import java.lang.reflect.Method;

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

import com.wxy.service.impl.CopyOfPeopleServiceBean;

/**
*   创建代理对象
*    
*   @create-time     2011-8-19   上午09:07:53   
*   @revision          $Id
*/
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());//将目标类设置为代理对象的父类,可以覆盖所有非final方法进行覆盖
        enhancer.setCallback(this);//设置回调用对象为本身

        return enhancer.create();
    }

    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
                                                                                                throws Throwable {

        CopyOfPeopleServiceBean bean = (CopyOfPeopleServiceBean) this.targetObject;
        Object result = null;//环绕通知
        if (bean.getUser() != null) {
            //.....advice()-->前置通知
            try {
                result = methodProxy.invoke(targetObject, args);
                //.....afteradvice()-->后置通知
            } catch (RuntimeException e) {
                //.....exceptionadvice()-->例外通知
            } finally {
                //.....finallyadvice()-->最终通知
            }
        }

        return result;
    }

}

 

3、  测试:

public class AOPTest {
    public static void main(String[] args) {
        /*   JDKProxyFactory factory = new JDKProxyFactory();
           PeopleService service = (PeopleService) factory.createProxyInstance(new PeopleServiceBean(
               "wxy"));

           service.save("wxy");*/

        CGlibProxyFactory factory = new CGlibProxyFactory();
        CopyOfPeopleServiceBean service = (CopyOfPeopleServiceBean) factory
            .createProxyIntance(new CopyOfPeopleServiceBean("wxy"));
        service.save("cglib-wxy");
        CopyOfPeopleServiceBean service1 = (CopyOfPeopleServiceBean) factory
            .createProxyIntance(new CopyOfPeopleServiceBean());//没有权限
        service1.save("cglib-wxy");
    }

}

 

4、  结果:

public class AOPTest {
    public static void main(String[] args) {
        /*   JDKProxyFactory factory = new JDKProxyFactory();
           PeopleService service = (PeopleService) factory.createProxyInstance(new PeopleServiceBean(
               "wxy"));

           service.save("wxy");*/

        CGlibProxyFactory factory = new CGlibProxyFactory();
        CopyOfPeopleServiceBean service = (CopyOfPeopleServiceBean) factory
            .createProxyIntance(new CopyOfPeopleServiceBean("wxy"));
        service.save("cglib-wxy");
        CopyOfPeopleServiceBean service1 = (CopyOfPeopleServiceBean) factory
            .createProxyIntance(new CopyOfPeopleServiceBean());//没有权限
        service1.save("cglib-wxy");
    }

}

 

 

一些AOP概念:

Aspect(切面):指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象。

joinpoint(连接点):指那些被拦截到得点,在spring中,这些点是指方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器。

Pointcut(切入点):所谓切入点是指我们要对那些joinpoint进行拦截的定义。

Advice(通知):所谓通知是指拦截到joinpoint之后要做的事情就是通知:异常通知、前置通知、后置通知、环绕通知、最终通知。

Target(目标):代理的目标对象

Weave(织入):把将aspect应用到target对象并导致proxy对象创建的过程称为织入。

Introduction(引入):在不修改类代码的前提下,Introduction可以运行为类动态的添加一些方法或者Field

 

http://blog.csdn.net/iamtheevil/article/details/6700495

分享到:
评论

相关推荐

    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中,如果目标类没有...

    com.springsource.net.sf.cglib-2.2.0 aop依赖包

    com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.net.sf.cglib-2.2.0.jar

    com.springsource.net.sf.cglib-2.2.0.jar

    aop的jar包: com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

    com.springsource.net.sf.cglib-2.2.0.jar.zip

    com.springsource.net.sf.cglib-2.2.0.jar + com.springsource.org.aopalliance-1.0.0.jar + com.springsource.org.aspectj.weaver-1.6.4.RELEASE.jar + spring-aspects-4.3.11.RELEASE.jar

    cglib.jar下载

    CGLIB介绍与原理(部分节选自网络) 一、什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要...

    cglib aop spring 动态代理

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

    com.springsource.net.sf.cglib-2.2.0架包

    3. **AOP支持**:在Spring框架中,CGLIB用于实现切面编程,特别是当目标对象没有实现接口时。它创建被增强的对象实例,然后在方法执行前后插入额外的逻辑,如日志记录、事务管理等。 4. **性能**:尽管JDK的动态...

    org.aopalliance.aop.Advice.jar

    org.aopalliance.aop.Advice.jar net.springsource.cglib-2.2.0.jar

    cglib_cglib.zip

    CGLib的使用通常涉及到以下几个关键概念: 1. **Enhancer**:这是CGLib的主要入口点,用于创建代理对象。你可以向Enhancer传递一个类或者接口,它会生成指定类的子类。 2. **Callback**:回调接口,如...

    springAop.rar_AOP java_cglib_spring aop

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

    cglib.jar/cglib-nodep.jar免费下载

    在本篇文章中,我们将深入探讨CGLib的核心概念、用途以及如何使用。 **1. CGLib的基本原理** CGLib通过字节码操作技术来实现其功能。它不是直接修改已有的.class文件,而是基于ASM库在运行时生成新的字节码,从而...

    com.springsource.net.sf.cglib.7z

    总的来说,CGLIB是Spring AOP的重要组成部分,对于那些没有实现接口的类,CGLIB提供了代理能力,使得我们可以方便地进行面向切面的编程。同时,CGLIB的高性能和广泛的适用性也使其在Java开发中得到了广泛应用。理解...

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

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

    cglib.jar | asm.jar对应版本

    其中,`cglib.jar` 和 `asm.jar` 是实现Java动态代理的两个关键库,它们在许多框架和库中都有广泛的应用,比如Spring AOP和Hibernate。 `cglib.jar` 是一个强大的代码生成库,全称为Code Generation Library。它...

    基于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.jar免费下载

    - **AOP(面向切面编程)**:在Spring框架中,CGLIB被用于创建代理对象,实现方法拦截,从而实现切面逻辑,如事务管理、日志记录等。 - **ORM(对象关系映射)**:在Hibernate中,CGLIB用于创建实体对象的代理,...

    cglib.zip

    总结起来,CGLIB是一个强大的Java代码生成库,借助ASM库,它能够高效地生成和修改字节码,实现动态代理、类增强等功能,广泛应用于AOP、测试和ORM框架等多个领域。了解并掌握CGLIB的使用,对于提升Java开发的灵活性...

Global site tag (gtag.js) - Google Analytics