Khi chú thích một lớp bằng @Component, điều này có nghĩa là nó là một Spring Bean và Singleton?


111

Còn khá mới với Spring, tôi có một câu hỏi về việc chú thích một lớp. Khi chú thích một lớp với @Componentđiều này có nghĩa là lớp này sẽ là một Spring Bean và theo mặc định là một singleton?

Câu trả lời:


129

Vâng, đó là chính xác, @Componentlà một Spring bean và một Singleton.

Nếu lớp thuộc về các lớp dịch vụ mà bạn có thể muốn chú thích nó với @Servicethay

Nhưng hãy nhớ rằng để các chú thích này được phát hiện, bạn cần đặt dòng này vào applicationContext.xml:

<context:component-scan base-package="com.yourcompany" />

Về các singleton - các hạt đậu mùa xuân đều nằm trong phạm vi singleton theo mặc định. Điều duy nhất bạn phải lưu ý là bạn không nên lưu trữ trạng thái trong các biến trường (chúng chỉ nên chứa các phụ thuộc). Vì vậy, ứng dụng của bạn sẽ an toàn theo chuỗi và bạn sẽ không yêu cầu một phiên bản bean mới mỗi lần. Nói cách khác, đậu của bạn là không trạng thái.


1
Khi sử dụng chú thích @Component và hoặc @Service, v.v. nghĩa là tôi đang tạo Singletons, tôi sẽ không gặp phải các vấn đề về đồng thời chứ? Theo ý tưởng mới của tôi, nó sẽ dẫn đến một bean được sử dụng trong toàn bộ ApplicationContext, vì vậy những người dùng đồng thời sẽ nhận được một tham chiếu đến bean đơn. Hay tôi đang thiếu cái gì đó?
Marco

3
@Marco nếu bạn không có bất kỳ trạng thái nào (biến cá thể khác với Spring bean), thì sẽ không có vấn đề đồng thời nào xảy ra.
Bozho

bạn "muốn" yêu cầu một phiên bản bean mới mỗi lần hay bạn "sẽ không" yêu cầu một phiên bản bean mới mỗi lần?
Harshana

@Bozho Ý của bạn là gì: "và bạn sẽ không yêu cầu một phiên bản bean mới mỗi lần"? Có nghĩa là Spring sẽ không phải tạo một phiên bản mới hay bạn với tư cách là một nhà phát triển sẽ không cần tạo một phiên bản mới?
user1766169

24

Theo mặc định - Có.

Tuy nhiên, bạn có thể ghi đè hành vi này bằng cách sử dụng @Scopechú thích. Ví dụ:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.