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" />
浙公网安备 33010602011771号