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大厂的前辈交流和学习 。

推荐阅读