Package com.alibaba.asyncload.impl.spring

Source Code of com.alibaba.asyncload.impl.spring.AsyncLoadInterceptor

package com.alibaba.asyncload.impl.spring;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

import com.alibaba.asyncload.impl.exceptions.AsyncLoadException;
import com.alibaba.asyncload.impl.template.AsyncLoadCallback;
import com.alibaba.asyncload.impl.template.AsyncLoadTemplate;

/**
* 开发基于拦截器实现的并行加载,注意依赖{@linkplain AsyncLoadTemplate}
*
* <pre>
* 适用于以下情况:
* 1. 原先的service对象已经被进行cglib代理,并行加载可以做为其中的一个代理进行织入
* 2. 希望通过BeanNameAutoProxyCreator进行自动代理配置,不想影响原先的bean配置
*
* 设计注意:
* 1. 这里依赖{@linkplain AsyncLoadTemplate}进行代码块的并行加载控制,而不能对原先的service进行代理(会产生死循环)
* 2. 并不直接提供method match的机制,希望是可以直接利用spring提供的PointCut进行控制
* </pre>
*
* 使用示例配置:
*
* <pre>
*     <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
*         <property name="proxyTargetClass" value="true" />
*         <property name="beanNames">
*             <list>
*                 <value>*DataFeeder</value>
*             </list>
*         </property>
*         <property name="interceptorNames">
*             <list>
*                 <value>asyncLoadInterceptor</value>
*             </list>
*         </property>
*     </bean>
* </pre>
*
* @author jianghang 2011-4-1 下午04:52:51
*/
public class AsyncLoadInterceptor implements MethodInterceptor {

    private AsyncLoadTemplate asyncLoadTemplate;

    public Object invoke(MethodInvocation invocation) throws Throwable {
        final MethodInvocation temp = invocation;
        return asyncLoadTemplate.execute(new AsyncLoadCallback() {

            public Object doAsyncLoad() {
                try {
                    return temp.proceed();
                } catch (Throwable e) {
                    throw new AsyncLoadException("AsyncLoadInterceptor invoke error!", e);
                }
            }
        }, invocation.getMethod().getReturnType()); // 这里指定了返回目标class

    }

    // =============== setter / getter =================

    public void setAsyncLoadTemplate(AsyncLoadTemplate asyncLoadTemplate) {
        this.asyncLoadTemplate = asyncLoadTemplate;
    }

}
TOP

Related Classes of com.alibaba.asyncload.impl.spring.AsyncLoadInterceptor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.