Spring讓人眼前一亮的11個小技巧( 四 )

Scope只有兩種:

  • singleton 單例,每次從spring容器中獲取到的bean都是同一個對象 。
  • prototype 多例,每次從spring容器中獲取到的bean都是不同的對象 。
spring web又對Scope進行了擴展,增加了:
  • RequestScope 同一次請求從spring容器中獲取到的bean都是同一個對象 。
  • SessionScope 同一個會話從spring容器中獲取到的bean都是同一個對象 。
即便如此,有些場景還是無法滿足我們的要求 。
比如 , 我們想在同一個線程中從spring容器獲取到的bean都是同一個對象,該怎么辦?
這就需要自定義Scope了 。
第一步實現Scope接口:
public class ThreadLocalScope implements Scope {private static final ThreadLocal THREAD_LOCAL_SCOPE = new ThreadLocal();@Overridepublic Object get(String name, ObjectFactory<?> objectFactory) {Object value = https://www.huyubaike.com/biancheng/THREAD_LOCAL_SCOPE.get();if (value != null) {return value;}Object object = objectFactory.getObject();THREAD_LOCAL_SCOPE.set(object);return object;}@Overridepublic Object remove(String name) {THREAD_LOCAL_SCOPE.remove();return null;}@Overridepublic void registerDestructionCallback(String name, Runnable callback) {}@Overridepublic Object resolveContextualObject(String key) {return null;}@Overridepublic String getConversationId() {return null;}}第二步將新定義的Scope注入到spring容器中:
@Componentpublic class ThreadLocalBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {beanFactory.registerScope("threadLocalScope", new ThreadLocalScope());}}【Spring讓人眼前一亮的11個小技巧】第三步使用新定義的Scope:
@Scope("threadLocalScope")@Servicepublic class CService {public void add() {}}最后說一句(求關注,別白嫖我)如果這篇文章對您有所幫助,或者有所啟發的話,幫忙掃描下發二維碼關注一下,您的支持是我堅持寫作最大的動力 。
求一鍵三連:點贊、轉發、在看 。
關注公眾號:【蘇三說技術】 , 在公眾號中回復:面試、代碼神器、開發手冊、時間管理有超贊的粉絲福利,另外回復:加群,可以跟很多BAT大廠的前輩交流和學習 。

推薦閱讀