Spring自定义Scope作用域[线程域]

需求:在Service/CoreBusiness/Handler/等层之间互相跳转,需要在同一个线程范围内,一直取得该DAO实例,而不是new一个或单例的,则现有Spring默认区间不足以满足需求。

这样做的弊端是:如果采用的是线程池,设入到该线程的对象可能会一直不会被remove掉。

 

直接上代码:

 

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.config.Scope;

public class ThreadScope implements Scope {
    private static final ThreadLocal threadLocal = new ThreadLocal(){
        protected Object initialValue() {
            return new HashMap(); 
          } 
    };

    @Override
    public Object get(String name, ObjectFactory objectFactory) {
        Map scope = (Map) threadLocal.get();
        Object object = scope.get(name);
        if (object == null) {
            object = objectFactory.getObject();
            scope.put(name, object);
        }
        return object;
    }

    @Override
    public Object remove(String name) {
        Map scope = (Map) threadLocal.get(); 
        return scope.remove(name); 
    }

    @Override
    public void registerDestructionCallback(String name, Runnable callback) {
    }

    @Override
    public String getConversationId() {
        return null;
    }

}


    <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="thread" value="ThreadScope"/>
            </map>
        </property>
    </bean>


    <bean id="Dao" class="DaoImpl" scope="thread" autowire="autodetect" />

posted on 2013-06-14 11:25  過眼云煙  阅读(924)  评论(0)    收藏  举报

导航