Spring SimpleThreadScope неправильно подключен к @Components - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть приложение Spring Boot, и мне нужно иметь bean-объекты, связанные с потоками.Я хочу решение, где мне нужно использовать SpringThreadThreadScope.Я попытался автоматически подключить его к @Components, но, основываясь на журналах, которые я печатаю, похоже, что Spring не создает новый компонент для каждого порожденного потока.Как правильно настроить / настроить bean-компонент?

Вот мой контроллер

@RestController
public class Controller {
  @Autowired
  private DummyClass dummyClass;

  @Autowired
  private DummyService1 svc;

  @PostMapping  
  public Result myPostMethod (@RequestBody Request request) {    
    LOGGER.info("myPostMethod " + Thread.currentThread().getName() + " " + Integer.toHexString(this.dummyClass.hashCode()));
    this.svc.doSomething();

    return new Result();
  }
}

Мои примеры служб

@Service
public class DummyService1 {

  @Autowired
  private DummyClass dummyClass;

  @Autowired
  private DummyService2 service;

  public void doSomething () {
    LOGGER.info("doSomething " + Thread.currentThread().getName() + " " + Integer.toHexString(this.dummyClass.hashCode()));

    this.service.doSomething2();
  }
}

@Service
public class DummyService2 {  

  @Autowired
  private DummyClass dummyClass;

  public void doSomething2 () {
    LOGGER.info("doSomething2 " + Thread.currentThread().getName() + " " + Integer.toHexString(this.dummyClass.hashCode()));
  }
}

Моя конфигурация

@Configuration
public class MyConfig implements WebMvcConfigurer {

  @Bean
  @Scope(value = "thread", proxyMode = ScopedProxyMode.TARGET_CLASS)  
  public DummyClass dummyClass () {
    DummyClass ctx = new DummyClass();
    return ctx;
  }

  @Bean
  public static BeanFactoryPostProcessor beanFactoryPostProcessor () {
    return new CustomScopeRegisteringBeanFactoryPostProcessor();
  }
}

public class CustomScopeRegisteringBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
  @Override
  public void postProcessBeanFactory (ConfigurableListableBeanFactory beanFactory) throws BeansException {
    beanFactory.registerScope("thread", new SimpleThreadScope());
  }
}

Фактический вывод после 2 выполнений

myPostMethod http-nio-8080-exec-4 81823b32
doSomething http-nio-8080-exec-4 81823b32
doSomething2 http-nio-8080-exec-4 81823b32

myPostMethod http-nio-8080-exec-8 81823b32
doSomething http-nio-8080-exec-8 81823b32
doSomething2 http-nio-8080-exec-8 81823b32

Ожидаемый вывод после 2 выполнений

myPostMethod http-nio-8080-exec-4 81823b32
doSomething http-nio-8080-exec-4 81823b32
doSomething2 http-nio-8080-exec-4 81823b32

myPostMethod http-nio-8080-exec-8 9a5170d
doSomething http-nio-8080-exec-8 9a5170d
doSomething2 http-nio-8080-exec-8 9a5170d

Я заметил, что если я выполняю метод (set или get) в DummyClass, новый экземплярбудет создан на поток.Моя проблема заключается в том, что вновь созданный объект не внедряется в компоненты (DummyService1 и DummyService2)

1 Ответ

0 голосов
/ 16 ноября 2018

WebApplicationContext.SCOPE_REQUEST, который является частью Web Aware Scopes, которые всегда предоставляют разные bean-компоненты для каждого запроса

@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
...