gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:02:45 26 4
gpt4 key购买 nike

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

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

我的问题是我希望每次都创建一个新的 RestClient 实例。想到使用 Springs Scope 注释:@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)但似乎无法理解如何使用它,如果我使用 new 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();
}

最佳答案

首先resttemplate是thread-safe .不要根据请求或使用 new 关键字(Constructor)实例化它,这是一个糟糕的设计。因为你在这里注释掉了@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE);默认情况下,spring 将创建一个 RestClient 的单例 bean,无论您在何处 Autowiring ,您都将获得相同的 RestClient 实例;所以你做对了。

@Service
//@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) //NEEDED??
class RestClient {

不过我有一个问题,在 RestClient 中,你在哪里实例化 private RestTemplate rest; 我在你发布的代码中没有看到它

如果您按照建议从原型(prototype)作用域转移到单例作用域,您可以使用@Autowired RestClient restClient;

代替

@Autowired private WebApplicationContext context;
RestClient x = (RestClient)context.getBean("restTest")

更少样板文件。

关于java - 在 Spring 中创建新实例和使用范围原型(prototype)注释之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46447798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com