编程语言
首页 > 编程语言> > java-在Spring中创建新实例与使用范围原型注释之间的区别

java-在Spring中创建新实例与使用范围原型注释之间的区别

作者:互联网

我的应用程序正在侦听交换(使用rabbitMQ),希望接收一些API数据,然后将其重定向到相关位置.

当目的是打开一个新线程并通过每次创建RestClient来发送请求时,我正在使用rxJava来订阅这些更改.它会接收数据,解析,发送数据,然后将响应发送回队列.

我的问题是我想每次都创建我的RestClient的新实例.想过使用Spring Scope注释:@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE),但似乎无法理解如何使用它,如果每次使用新的RestClient都会有什么区别.

您能否解释一下使用getBean而不是使用new的优势?

这是代码:

class MyManager {

   @Autowired
   private WebApplicationContext context;
    ....
    ...
    ...

    @PostConstruct
    myListener.subscribeOn(Schedulers.computation()).subscribe(this::handleApiRequest);


    private void  handleApiRequest(ApiData apiData){

    // Option 1:
    RestClient client = new RestClient();
    client.handleApiRequest(apiData);

    //Option 2:
    // use somehow the prototype?
    RestClient x = (RestClient)context.getBean("restTest")..
    }
}



 @Service
 //@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) //NEEDED??
class RestClient {
 private String server;
  private RestTemplate rest;
  private HttpHeaders headers;
  ResponseEntity<String> responseEntity;

  @PostConstruct
  private void updateHeaders() {
    headers.add(Utils.CONTENT_TYPE, Utils.APPLICATION_JSON);
    headers.add(Utils.ACCEPT, Utils.PREFIX_ALL);
  }


  public void handleApiRequest(ApiData apiRequest) {
    sendRequest(apiRequest); //implemented
    sendResponse(); //implemented
  }


}


  @Bean(name = "restTest")
  @Scope("prototype")
  public RestClient getRestTemplate() {
    return new RestClient();
  }

解决方法:

当您使用context.getBean时,返回的实例是Spring bean,spring处理依赖项注入,配置,生命周期回调….当您使用新的方式创建它时,这些都不会发生.在该示例中,您给出的@PostConstruct方法仅在使用context.getBean时才会被调用.

标签:rx-java2,annotations,spring,java,spring-mvc
来源: https://codeday.me/bug/20191025/1930363.html