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