论坛首页 Java企业应用论坛

AOP功能和AOP框架

浏览 6992 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-08-28  
这几天一直在思考在一个应用上实现AOP功能到底和实现独立的一个AOP框架有什么不同。利用JDK动态代理或CGLIB甚至用Servlet Filter就能实现简单的AOP功能,那么AOP框架的价值究竟在哪里?
表面上来看,使用框架除了应用开发人员不需要知道CGLIB原理,代码中不会出现implements MethodInterceptor或Enhancer.Create()之外,找不到框架可以做而用CGLIB代码不能做的事情啊.BOSS让我提炼一个简单的AOP,一开始我准备包装一下CGLIB API做,但后来发现如果是实现一般的AOP功能,CGLIB已经可以完全胜任.如果要做一个AOP框架,我不知道应该往什么方向努力啊!!!!

另,看不明白CGLIB中Dispatcher和LazyLoader的用法啊,望指点.
   发表时间:2008-08-28  
起始簡單的包裝一層就夠了,把代理類創建的過程Enhancer.Create()過程包裝一下,預留MethodInterceptor的實現就好了。

LazyLoader是延遲加載的Callback
0 请登录后投票
   发表时间:2008-08-28  
不知道楼上知道不知道Enhancer类本身就提供多个静态的重载的create()方法
我只是在想如果要按照标准的AOP框架实现连接点、切点、增强等概念有没有必要,重复做轮子不如用好现在的轮子...只是貌似Spring aop框架都没有提供InterceptorChain的功能,达到多个advice reuse的目的,而反过来CGLIB中却又没有Exception处理的callback类型

另,看字面我也知道是延时加载,但是怎么用具体?
0 请登录后投票
   发表时间:2008-08-28  
直接使用现成的最好,省时省力。
0 请登录后投票
   发表时间:2008-08-28  
vvgg 写道
起始簡單的包裝一層就夠了,把代理類創建的過程Enhancer.Create()過程包裝一下,預留MethodInterceptor的實現就好了。

LazyLoader是延遲加載的Callback

0 请登录后投票
   发表时间:2008-10-14  
用代码实现代理类的生成总觉得不好用啊,使用ProxyFactory的客户代码总是不能跟客户代码松耦合
尤其是当这个客户代码是另外一个框架或者公共组件的一部分的时候,从而造成组件之间的耦合

package byd.rbac.proxy;

import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;

/**
 *
 * @author lilei1
 * <a href="mailto:li.lei1@byd.com">li.lei1@byd.com</a>
 */
public class ProxyFactory {

    private static Boolean flag;
    private static ProxyFactory factory = new ProxyFactory();

    private ProxyFactory() {
    }

    public static ProxyFactory getInstance() {
        return factory;
    }

    public ProxyFactory setSwitch(boolean isOpen) {
        flag = isOpen;
        return factory;
    }

    public static boolean isOpen() {
        return flag;
    }

    /**
     * 使用AuthorizeInterceptor使用默认的拦截器
     * @param target
     * @return
     */
    public Object getProxy(Class target, String userID, String scope, String operation, String type) {
        try {
            if (isOpen()) {
                Enhancer enhancer = new Enhancer();
                enhancer.setSuperclass(target);
                enhancer.setCallback(new AuthorizeInterceptor(userID, scope, operation, type));
                return enhancer.create();
            } else {
                return target.newInstance();
            }
        } catch (InstantiationException ex) {
            Logger.getLogger(ProxyFactory.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (IllegalAccessException ex) {
            Logger.getLogger(ProxyFactory.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (Throwable e) {
            e.printStackTrace();
            throw new Error(e.getMessage());
        }
    }

    /**
     * 使用自定义的拦截器产生代理
     * @param target
     * @param callback
     * @return
     */
    public Object getProxy(Class target, MethodInterceptor callback) {
        try {
            if (isOpen()) {
                Enhancer enhancer = new Enhancer();
                enhancer.setSuperclass(target);
                enhancer.setCallback(callback);
                return enhancer.create();
            } else {
                return target.newInstance();
            }
        } catch (InstantiationException ex) {
            Logger.getLogger(ProxyFactory.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (IllegalAccessException ex) {
            Logger.getLogger(ProxyFactory.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (Throwable e) {
            e.printStackTrace();
            throw new Error(e.getMessage());
        }
    }
}

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics