Hãy nói rằng tôi có một đối tượng Closeable
tiêm qua Guice sử dụng yêu cầu phạm vi:Có thể tự động xóa tài nguyên ở cuối phạm vi trong Guice không?
@Provides @RequestScoped
public MyCloseableResource providesMyCloseableResource(){
return new MyCloseableResourceImpl();
}
Có thể treo lên một phương pháp sạch-up mà sẽ tự động gọi close()
về tài nguyên của tôi khi phạm vi tồn tại, mà không cần thế nào để triển khai phạm vi tùy chỉnh?
Nhìn vào tùy chỉnh scope implementation guide trên wiki Guice, nó cho thấy rằng phạm vi nên được tạo ra và dọn dẹp như thế này:
/**
* Runs {@code runnable} in batch scope.
*/
public void scopeRunnable(Runnable runnable) {
scope.enter();
try {
// explicitly seed some seed objects...
scope.seed(Key.get(SomeObject.class), someObject);
// create and access scoped objects
runnable.run();
} finally {
scope.exit();
}
}
tôi tự hỏi nếu có cách để treo lên một số tùy chỉnh dọn dẹp mã trong số finally
của phạm vi tích hợp (đặc biệt là phạm vi phiên và yêu cầu).
Nếu không thể, có thể có vấn đề khiến bạn không muốn làm sạch tự động?
Tôi đã tìm ra cách để đạt được hiệu quả tương tự trong các thùng chứa servlet bằng cách implementing a Filter để tạo và dọn sạch tài nguyên theo yêu cầu, hoạt động tốt nhưng tôi tò mò nếu nó có thể là với Guice thuần túy.
Triển khai phạm vi mở rộng, ý tưởng rất hay! Vì vậy, để sử dụng điều này với phạm vi yêu cầu, tôi sẽ tạo 'MyRequestScope' mở rộng lớp phạm vi của bạn từ blog, nối nó vào cùng một vị trí với mặc định' RequestScope' (phần khó), làm 'scope.enter()' với ' AbstractAttributeHolder' và chắc chắn rằng tôi gọi 'dispose()' ở cuối cùng (hoặc trong 'exit()' của 'MyRequestScope')? Nếu bạn có một cách tích hợp tốt, bạn có thể chia sẻ nó (mã và/hoặc kỹ thuật) không? – rodion
Về mã liên quan đến đồng bộ hóa, có vẻ như không cần thiết vì 'AttributeHolder' luôn được truy cập từ' ThreadLocal' do đó một cá thể duy nhất cho mỗi luồng. Tui bỏ lỡ điều gì vậy? – rodion
1) Tôi không sử dụng điều này trong môi trường Servlet, vì vậy tôi không chắc chắn làm thế nào để làm điều này đúng cách. – Waldheinz