`

基于CGLib(面向Class)的AOP的简单实现.

    博客分类:
  • JAVA
阅读更多

/*
 *auth: lanmh
 */

/**
 * 基于CGLib(面向Class)的AOP的简单实现.
 */

import java.lang.reflect.*;
import java.util.*;

import net.sf.cglib.proxy.*;
import org.apache.commons.logging.Log;

public abstract class AOPBaseClass
    implements MethodInterceptor
{
    private static Log logger = org.apache.commons.logging.LogFactory.getLog(
        AOPBaseClass.class);

    /**用于动态产生被代理类的子类*/
    private Enhancer enhancer = new net.sf.cglib.proxy.Enhancer();

    /**存放所有的拦截器**/
    protected List interceptors = new ArrayList();

    /**要拦截方法的名称集合*/
    protected List interMethodNames = new ArrayList();

    public AOPBaseClass()
    {
        initInterceptors(); //初始化拦截器
        initInterMethodNames(); //初始化拦截方法名称集合
    }

    /***
     * 初始化拦截器
     */
    protected abstract void initInterceptors();

    /**
     * 初始化拦截的方法的名称集合
     */
    protected abstract void initInterMethodNames();

    /**
     *动态产生被代理类的子类的实例..
     * @param clz Class被代理类的Class
     * @return Object 返回被代理类的子类的实例
     */
    public Object bind(Class clz)
    {
        enhancer.setSuperclass(clz); //设置超类
        enhancer.setCallback(this); //设置回调
        Object obj = enhancer.create(); //生成被代理类的子类实例
        return obj;
    }

    /**
     *对被代理的类的方法进行拦截
     * @param proxy Object 动态生成的被代理类的子类
     * @param method Method 被代理类被拦截的方法
     * @param methodParameters Object[] 被代理类被拦截的方法的参数列表
     * @param methodProxy MethodProxy  动态生成的被代理类的子类的方法
     * @throws Throwable
     * @return Object 返回被代理类被拦截的方法执行的结果
     */
    public Object intercept(Object proxy, Method method,
                            Object[] methodParameters, MethodProxy methodProxy)
        throws Throwable

    {
        Object result = null;
        InvocationInfo invInfo = null;
        Throwable ex = null;

        String methodName = method.getName();
        invInfo = new InvocationInfo(proxy,
                                     method,
                                     methodParameters,
                                     methodProxy,
                                     result,
                                     ex);

        if (interMethodNames.contains(methodName)) //如果调用的方法名称存在于拦截方法的名称集合
        {
            try
            {

                //调用 Before Intercetpors
                invokeInterceptorsBefore(invInfo);

                result = methodProxy.invokeSuper(proxy, methodParameters);

                //调用  After Intercetpors
                invInfo.setResult(result);
                invokeInterceptorsAfter(invInfo);
            }
            catch (Throwable tr)
            {
                //调用 Exception Intercetpors
                invInfo.setException(tr);
                invokeInterceptorsExceptionThrow(invInfo);
                throw tr;
            }
            finally
            {
                //调用last Intercetpors
                invokeInterceptorsLast(invInfo);
            }
        }
        else //否则如果调用的方法名称存在于拦截方法的名称集合
        {
            //直接调用被代理类的方法
            result = methodProxy.invokeSuper(proxy, methodParameters);
        }
        return result;

    }

    /**
     * 调用Before Interceptor
     * @param invInfo InvocationInfo
     */
    private void invokeInterceptorsBefore(InvocationInfo invInfo) throws EduException
    {

        //递增循环调用所有拦截器(interceptors)的before方法;
        for (int i = 0; i < interceptors.size(); i++)
        {
            Interceptor brt = (Interceptor) interceptors.get(i);
            brt.before(invInfo);
        }
    }

    /**
     * 调用After Interceptor
     * @param invInfo InvocationInfo
     */
    private void invokeInterceptorsAfter(InvocationInfo invInfo)throws EduException
    {

        //递减循环调用所有拦截器(interceptors)的After方法;
        for (int i = interceptors.size() - 1; i >= 0; i--)
        {
            Interceptor brt = (Interceptor) interceptors.get(i);
            brt.after(invInfo);
        }
    }

    /**
     * 调用Last Interceptor
     * @param invInfo InvocationInfo
     */
    private void invokeInterceptorsLast(InvocationInfo invInfo)throws EduException
    {

        //递减循环调用所有拦截器(interceptors)的After方法;
        for (int i = interceptors.size() - 1; i >= 0; i--)
        {
            Interceptor brt = (Interceptor) interceptors.get(i);
            brt.last(invInfo);
        }
    }

    /**
     * 调用exceptionThrow Interceptor
     * @param invInfo InvocationInfo
     */
    private void invokeInterceptorsExceptionThrow(InvocationInfo invInfo)throws EduException
    {

        //递减循环调用所有拦截器(interceptors)的exceptionThrow方法;
        for (int i = interceptors.size() - 1; i >= 0; i--)
        {
            Interceptor brt = (Interceptor) interceptors.get(i);
            brt.exceptionThrow(invInfo);
        }
    }

}

分享到:
评论

相关推荐

    cglib-nodep-2.2.2.jar.zip

    CGlib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)框架中都有广泛应用,如Spring AOP和dynaop。CGlib是由Evan Schooler创建并维护的,它是一个Java字节码操纵...

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

    CGLib,全称Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛使用,特别是在动态代理和AOP(面向切面编程)领域。这个库允许开发者在运行时动态创建类或者增强已有类的功能。在本篇...

    spring-aop.jar

    Spring AOP通过spring-aop.jar实现了面向切面编程的强大功能,简化了代码结构,提高了代码复用性。理解和熟练运用Spring AOP,能够使我们的应用程序更加灵活、可维护。无论是日志记录、事务管理还是其他关注点,都...

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

    在Java世界中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种设计模式,它允许程序员定义“切面”,这些切面可以插入到应用程序的多个点,以实现跨切面关注点的模块化,如日志、事务管理、性能度量等...

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

    JavaEE CGLIB字节码增强技术是实现面向切面编程(AOP)的一种常见方法。在JavaEE应用中,AOP允许开发者定义“切面”,这些切面封装了跨越多个对象的横切关注点,如日志、事务管理等。CGLIB(Code Generation Library...

    Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现.doc

    Spring AOP,全称Aspect Oriented Programming,即面向切面编程,是Spring框架的一个重要特性,用于实现横切关注点的模块化。AOP通过在运行时动态地将代码编织到一起,使得我们可以在不修改原有业务代码的情况下,对...

    spring-aop-3.2.0.RELEASE-sources.jar.zip

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它为开发者提供了声明式事务管理、日志记录、性能监控等跨切面的关注点。在Spring 3.2.0.RELEASE版本中,AOP功能进一步完善,...

    spring_aop_cglib的实现方式

    在Spring AOP(面向切面编程)中,CGLIB是一个重要的动态代理库,它用于在运行时创建子类以实现对目标对象的代理。CGLIB是针对那些不支持接口代理(例如Java中的final类)的情况而设计的。下面我们将深入探讨Spring ...

    cglib aop spring 动态代理

    静态代理--不适合企业开发,适合初学者理解代理。... 3.cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。 spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib

    cglib.jar和asm.jar

    CGlib是一个强大的高性能的代码生成包,它被许多AOP(面向切面编程)框架如Spring AOP和dynaop所使用,以提供方法拦截功能。CGlib不依赖于任何其他库,但自身可以与ASM库结合使用,以实现更底层的字节码操作。 ASM是...

    Cglib的jar文件 Cglib.zip

    这个库被广泛用于实现AOP(面向切面编程)中的代理机制,特别是当无法通过接口代理时,例如Java标准库中的类。Cglib是Eclipse的Dynamic Proxies的一个补充,它在某些情况下提供了更高的性能。 Cglib的核心是基于ASM...

    Xml配置实现AOP

    基于代理的AOP实现主要涉及到两种代理方式:JDK动态代理和CGLIB代理。Spring会根据目标对象是否实现了接口来选择合适的代理方式。 - **JDK动态代理**:如果目标对象实现了至少一个接口,Spring会选择JDK动态代理。...

    基于MAVEN项目的CGLib动态代理原理及实现

    它广泛用于许多AOP(面向切面编程)框架,如Spring AOP和dynaop,作为JDK动态代理的替代品,当目标类不支持接口时,CGLib能发挥重要作用。 3. CGLib工作原理 CGLib通过继承的方式创建代理对象。它会生成一个目标类的...

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

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点从核心业务逻辑中分离出来,例如日志记录、事务管理等。在本篇Spring学习笔记中,我们将探讨如何使用CGLIB库来实现AOP功能。 CGLIB...

    spring基于AOP实现事务

    本文将深入探讨如何基于AOP(面向切面编程)来实现Spring的事务管理,特别是通过TransactionProxyFactoryBean。让我们一起探索这个主题。 首先,了解什么是AOP。AOP是Spring框架的核心特性,它允许我们在不修改业务...

    cglibjar包

    CGLIB通过字节码操作实现其功能,它可以创建新类而不必直接访问Java反射API,这使得它在性能上比基于接口的Java动态代理更优。 CGLib的工作原理是:当程序调用一个被CGLib代理的方法时,CGLIB会生成一个新的子类,...

    AOP基于注解配置.zip

    Spring的面向切面编程(Aspect-Oriented Programming,简称AOP)功能允许开发者将关注点分离,如日志、事务管理等,从核心业务逻辑中抽离出来,实现代码的模块化和可重用性。本知识点主要围绕"AOP基于注解配置"展开...

    cglib-2.2.0.jar

    CGlib不仅在AOP(面向切面编程)领域有广泛应用,如Spring AOP框架就使用了CGlib来实现针对无接口类的代理,还常用于性能优化、测试模拟对象等方面。在"cglib-2.2-license.txt"文件中,可能包含了关于CGlib 2.2.0...

    spring-aop.rar_aop1270_spring_spring aop

    Spring AOP,即Spring的面向切面编程,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强或统一处理的方法。本文将围绕Spring AOP的源码分析,探讨其核心概念、工作原理以及在...

    基于框架的Web开发-基于XML配置的AOP.doc

    在基于框架的Web开发中,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种重要的设计模式,它允许开发者将关注点分离,比如日志、事务管理等,从核心业务逻辑中抽离出来。当注解方式无法使用时,我们...

Global site tag (gtag.js) - Google Analytics