2010-01-18 43 views
8

Spring làm DI và tạo các đối tượng để chương trình của bạn không cần phải lo lắng về việc tạo các đối tượng. Nhưng câu hỏi ở đây là khi một thể hiện của đối tượng được tiêm được tạo ra. Có phải là khi chương trình chính sử dụng cá thể hoặc tại thời điểm một cá thể của chương trình chính được tạo ra.Khi nào Spring tạo ra các đối tượng của các đối tượng được tiêm

Trả lời

12

Tất cả các hạt trong ngữ cảnh được khởi tạo, được tiêm và khởi tạo khi bối cảnh khởi động. Vào thời điểm đậu đầu tiên được lấy ra từ ngữ cảnh, tất cả các bean đã sẵn sàng để sử dụng.

Có hai điều có thể ngăn chặn một bean được khởi tạo ở bối cảnh khởi động:

  • Một bean có đậu cấu hình với một different scope (như prototype, request hay session), sử dụng scope="xyz" thuộc tính
  • Một chiếc đậu đã được đánh dấu bằng lazy-init="true", trong trường hợp đó nó sẽ chỉ được khởi tạo khi nó được yêu cầu một cách rõ ràng, hoặc nếu nó được yêu cầu như là một sự phụ thuộc của một số bean khác.
+3

bạn đã đúng! Một bean không đơn sẽ không được tạo ngay lập tức. +1 – nanda

+0

Cảm ơn skaffman, điều đó làm rõ sự nghi ngờ của tôi. Vì vậy, nó là tối đa các lập trình viên để quyết định liệu một bean cần phải được lười biếng khởi tạo hoặc khởi tạo trước. Điều này có thể rất chủ quan, nhưng bạn có thể cho tôi biết về bất kỳ thực tiễn tốt nhất nào sau đây trong tình huống này không. –

+0

Nó hoàn toàn chủ quan, có, nhưng sau đó như vậy là phần còn lại của xây dựng phần mềm. Điều này là không khác nhau. Tuy nhiên, vị trí mặc định của bạn phải là không lười và phạm vi mặc định. Chỉ làm cho một hạt khác nếu bạn có một lý do rất tốt. – skaffman

2

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-lazy-init

Theo mặc định, ApplicationContext triển khai háo hức tạo và cấu hình tất cả đậu singleton như là một phần của quá trình khởi tạo. Nói chung, sự khởi tạo trước này là điều mong muốn, bởi vì các lỗi trong cấu hình hoặc môi trường xung quanh được phát hiện ngay lập tức, trái với giờ hoặc thậm chí vài ngày sau đó. Khi hành vi này không phải là mong muốn, bạn có thể ngăn chặn sự khởi tạo trước của một bean đơn bằng cách đánh dấu định nghĩa bean là lười biếng-khởi tạo. Một bean lười được khởi tạo cho biết container IoC tạo ra một cá thể bean khi nó được yêu cầu lần đầu tiên, thay vì lúc khởi động.

4

Trong một bình luận, OP viết:

Vì vậy, nó tùy thuộc vào các lập trình viên để quyết định xem một bean cần được lười biếng khởi tạo hoặc khởi tạo trả trước. Điều này có thể rất chủ quan, nhưng bạn có thể cho tôi biết về bất kỳ thực hành tốt nhất nào trong các tình huống này không.

Có, tùy thuộc vào lập trình viên (hoặc nhà tích hợp hệ thống) để quyết định.

Không thực sự có bất kỳ quy tắc "thực hành tốt nhất" nào để quyết định. Hãy suy nghĩ theo cách này:

  • Nếu bạn khai báo một cách lười biếng khi được khởi tạo khi cần phải khởi tạo, bạn có thể làm chậm quá trình khởi động.

  • Nếu bạn tuyên bố một bean được khởi tạo háo hức khi không phải lúc nào cũng cần thiết, bạn sẽ làm cho quá trình khởi động chậm hơn và có thể sử dụng nhiều bộ nhớ hơn. Trong trường hợp xấu nhất, việc tạo ra bean không cần thiết thậm chí có thể khiến khởi động thất bại.

Tóm lại, bạn cần hiểu ứng dụng của mình.

+0

+1 đánh giá cao lời khuyên "trong ngắn hạn, bạn cần phải hiểu ứng dụng của bạn." – asgs

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