Spring - 通过代码在每个请求中注册请求范围的bean是否合适?

时间:2017-10-03 13:20:17

标签: spring spring-mvc spring-boot

在Spring Web应用程序中,我必须在应用程序中的另一个spring类中使用来自请求对象的特定值。值是请求特定值。

在下面的示例中,是每次注册来自请求正文的值并使用@Autowired@RequestScope注释在另一个春天使用值的好方法(例如@Service)类?通过RequestScopedType为每个请求注册BeanFactory bean值是否合适?

@RestController
@RequestMapping("/")
public class VehicleServiceController {

  @Autowired 
  private BeanFactory beanFactory;
  @Autowired 
  private ServiceClass serviceClass;

  @PostMapping(path = "/postDetails", consumes = MediaType.APPLICATION_JSON_VALUE)
  public OutputPayload postDetails(
        @RequestBody InputPayload inboundPayload) throws Exception {
    beanFactory.getBean(RequestScopedType.class).setValue(inboundPayload.getType());
    return serviceClass.methodToCall();
  }
}

由于负载非常大,是否会对性能产生任何影响?有没有其他方法可以注入/获取RequestBody对象值(inboundPayload.getType())?

1 个答案:

答案 0 :(得分:0)

你不必做beanFactory.getBean(RequestScopedType.class)。您只需将其自动装配@Autowired RequestScopedType requestScopedType即可。

不要忘记将bean的范围更改为Request。

@Component
@Scope(scopeName = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestScopedType {

但这引出了另一个问题,为什么过于复杂化,为什么不能将inboundPayload.getType()传递给serviceClass.methodToCall();

什么阻止您以这种方式使用return serviceClass.methodToCall(inboundPayload.getType());