2011-12-23 42 views
14

Tôi đã có một hạt đơn có một phương pháp tạo ra các cá thể của một bean nguyên mẫu. Tôi đang sử dụng phương pháp documented here để nhận các phiên bản của bean nguyên mẫu.Mùa xuân - Làm thế nào tôi có thể phá hủy hạt đậu nguyên mẫu?

public class SingletonService implements ApplicationContextAware { 

    private ApplicationContext applicationContext; 

    public void go() { 

     MyPrototypeBean prototype = applicationContext 
      .getBean(MyPrototypeBean.class); 

     prototype.doSomething(); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) 
     throws BeansException { 

     this.applicationContext = applicationContext; 
    } 
} 

Lúc đầu, tôi nghĩ rằng đây là đủ tốt, đó dụ của tôi về 'nguyên mẫu' sẽ đi ra khỏi phạm vi khi 'đi' phương pháp quay trở lại, có nghĩa là các trường hợp có thể đã không tham khảo và sẽ được thu gom rác .

Tuy nhiên, một peer chỉ ra tuyên bố sau từ the documentation:

Mã khách hàng phải dọn dẹp đối tượng nguyên mẫu-scoped và giải phóng nguồn lực đắt rằng đậu nguyên mẫu (s) đang nắm giữ.

Vì vậy, có vẻ như Spring sẽ giữ nguyên tham chiếu và do đó gc sẽ không bao giờ nhặt nó? Nếu đó là trường hợp làm thế nào để tôi nói với Spring để phát hành các tài liệu tham khảo? Tài liệu này đề cập rằng tôi có thể sử dụng 'trình xử lý hậu đậu tùy chỉnh', nhưng không rõ nơi bộ xử lý đó sẽ phù hợp và mã nào sẽ chạy.

Cảm ơn tất cả trước cho giúp đỡ, Roy

Trả lời

12

Tôi nghĩ rằng bạn đang hiểu nhầm các tài liệu hướng dẫn. Nó chỉ nói rằng Spring sẽ không quản lý vòng đời của bean nguyên mẫu, vì vậy các phương thức @PreDestroy (vv) cần phải được gọi bằng mã của riêng bạn. Spring sẽ không giữ lại một tham chiếu.

+0

Cảm ơn Nghệ thuật - vì vậy, an toàn để nói rằng mã ở trên là đủ và sẽ không phải là nguyên nhân gây ra rò rỉ bộ nhớ? –

+1

tốt, điều đó phụ thuộc vào việc thực hiện MyPrototypeBean, nhưng từ một quan điểm mùa xuân thì tốt. – artbristol

+0

Để truy xuất bean u, sử dụng phương thức getBean (..). Tôi hiểu rằng rất nhiều chi phí với màn trình diễn. làm thế nào bạn nên lấy nó sau đó? – rayman

Các vấn đề liên quan