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
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
haysession
), sử dụngscope="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.
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.
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.
+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
- 1. Trình tạo ID cho các đối tượng được tạo ra
- 2. Khi nào các đối tượng gói được khởi tạo?
- 3. Tiêm một mảng của các đối tượng trong Guice
- 4. Tiêm phụ thuộc: tiêm các đối tượng được khởi tạo một phần
- 5. Python, tạo các đối tượng
- 6. Làm thế nào để khởi tạo đối tượng xảy ra khi deserializing các đối tượng nhị phân trong Flex?
- 7. Làm thế nào để tiêm FactoryBean thay vì đối tượng nó tạo ra?
- 8. Entity Framework: ObjectContext.ExecuteStoreQuery tạo ra các đối tượng tách rời
- 9. C++ vectơ của các đối tượng và vectơ của con trỏ đến các đối tượng
- 10. khởi tạo các đối tượng trong C++
- 11. Làm thế nào để tiêm một đối tượng HTTP-Request-specific vào đối tượng Unity được cung cấp của tôi?
- 12. Khi nào là đối tượng thuộc tính được tạo?
- 13. Các thuộc tính tạm thời của Grails không được chọn đối tượng tạo ra
- 14. kết hợp các đối tượng nsdata vào đối tượng nsmutabledata
- 15. Chỉ định các thuộc tính của đối tượng Rails được chuyển vào đối tượng JSON
- 16. Tạo các đối tượng trong Loop C#
- 17. Tạo danh sách đối tượng của các đối tượng khác nhau
- 18. Đối tượng trong các đối tượng trong OCaml
- 19. Cách lồng các đối tượng khi tạo JSON bằng JSONObject
- 20. tạo đối tượng json với các biến
- 21. Làm thế nào để tạo ra đối tượng tập tin từ đối tượng URL
- 22. Nhận các đối tượng cụ thể từ ArrayList khi các đối tượng được thêm vào ẩn danh?
- 23. DDD: Các đối tượng kết nối là đối tượng thực thể hoặc đối tượng giá trị?
- 24. Inheritance: đối tượng tạo
- 25. Vòng đời của các đối tượng Java cục bộ được tạo trong khi gọi phương thức
- 26. CDI với các đối tượng không được quản lý
- 27. có được các đối tượng trong NSMutableArray
- 28. Khởi tạo một mảng của các đối tượng
- 29. Trọng một phương pháp trong các đối tượng tĩnh tạo
- 30. Làm thế nào để Xuân biết nơi cần lấy đối tượng proxy cần được tiêm?
bạn đã đúng! Một bean không đơn sẽ không được tạo ngay lập tức. +1 – nanda
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. –
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