我正在维护一个应用程序,并注意到在Spring连接中定义为Singleton的许多对象在其方法中创建了其他对象的新实例。
例如,每次调用login()方法时都会有一个LoginService Singleton创建一个新的LoginDetails实例。 LoginDetails是临时的,只有执行login()方法才需要。
我的问题是,如果Spring为LoginService创建了一个对象,那么LoginDetails的实例是如何标记为垃圾收集的,作为对创建它们的对象的引用并使用它们永远不会终止?
我的意思是:
public void deleteCustomer(Long customerId, HttpServletRequest request) {
CustomerType customerType = new CustomerType();
customerType.setCustomerId(customerId);
CustomerDeleteRequestType deleteRequest = new CustomerDeleteRequestType();
deleteRequest.setCustomer(customerType);
CustomerDeleteResponseType deleteResponse = mmmwsClient.executeRequest(deleteRequest);
log.debug("Delete Response Recieved from Server for Customer Name Update " + deleteResponse.getServiceResult());
}
由于使用的字段只是方法变量而不是实例变量,我想在方法完成时会破坏对它们的引用吗?
我对Spring Singleton的理解是否正确?
由于
答案 0 :(得分:5)
如果单例不维护对它创建的对象的引用(通过将它们存储在实例字段中),并且如果没有其他可到达对象保持对这些对象的引用,则它们变得无法访问,并且垃圾收集器收集它们。
创建对象的人对垃圾收集器并不重要。谁有对象的引用是。
答案 1 :(得分:1)
老实说,我不明白这个问题,但是已经很晚了,所以请耐心等待。
我查看了this页面,似乎每次调用该方法时都会创建一个新实例。
如果你像他们一样使用它,一个很好的替代品可能是:
private static MessageResourceSingleton singleton;
public static MessageResourceSingleton getInstance() {
if (singleton == null) {
singleton = new MessageResourceSingleton();
}
return singleton;
}
我可能不完全了解您的目标,但如果您能向我们展示一些您正在使用的示例,那么可以帮助 。