Trong phần này, chúng ta sẽ khám phá về Spring Beans và Spring Annotations, hai thành phần quan trọng trong Spring Framework.
Spring Beans
21. Spring beans là gì?
Spring Beans là những đối tượng Java, tạo nên khung sườn của một ứng dụng Spring. Chúng được cài đặt, lắp ráp và quản lý bởi Spring IoC container. Configuration metadata được cung cấp từ container để tạo ra các bean này, ví dụ như trong file XML.
22. Định nghĩa Spring bean gồm những gì?
Một định nghĩa Spring bean chứa toàn bộ metadata cần thiết để tạo ra bean, cũng như chi tiết về lifecycle và các dependencies của nó.
23. Làm sao để cung cấp configuration metadata cho Spring Container?
Có ba cách để cung cấp configuration metadata cho Spring container:
- Thông qua XML configuration file.
- Thông qua Annotation-based configuration.
- Thông qua Java-based configuration.
24. Làm sao để định nghĩa scope của bean?
Khi định nghĩa một bean trong Spring, chúng ta cần định nghĩa scope của bean. Điều này có thể được thực hiện thông qua thuộc tính "scope" khi định nghĩa bean. Ví dụ, nếu muốn tạo một bean mới mỗi khi sử dụng, chúng ta sử dụng scope "prototype". Nếu muốn một bean luôn trả về một instance duy nhất khi sử dụng, chúng ta sử dụng scope "singleton".
25. Các scope của bean
Spring framework đưa ra năm scope của bean:
- "singleton": cho biết bean có một instance duy nhất trong container.
- "prototype": cho biết bean có nhiều instance, mỗi lần sử dụng sẽ tạo mới.
- "request": cho biết bean có độ phạm vi của một HTTP request. Scope này chỉ hợp lệ khi sử dụng Web Application Context.
- "session": cho biết bean có độ phạm vi của một HTTP session. Scope này cũng chỉ hợp lệ khi sử dụng Web Application Context.
- "global-session": cho biết bean có độ phạm vi của một global HTTP session. Scope này cũng chỉ hợp lệ khi sử dụng Web Application Context.
26. Singleton Bean có Thread safe trong Spring Framework?
Không, trong Spring framework, singleton bean không thread safe.
27. Bean lifecycle trong Spring framework
Bean lifecycle trong Spring framework gồm các bước:
- Spring container tìm và khởi tạo bean từ file XML.
- Spring cài đặt các thuộc tính đã được định nghĩa trong bean (Dependency Injection).
- Nếu bean implement interface "BeanNameAware", Spring truyền bean id vào hàm "setBeanName()".
- Nếu bean implement interface "BeanFactoryAware", Spring truyền beanfactory vào hàm "setBeanFactory()".
- Nếu có BeanPostProcessors nào liên kết với bean đang được khởi tạo, Spring gọi hàm "postProcesserBeforeInitialization()" và "postProcessAfterInitialization()".
- Nếu bean implement interface "InitializingBean", phương thức "afterPropertySet()" sẽ được gọi. Nếu bean đã được khai báo phương thức khởi tạo, thì phương thức đó sẽ được gọi.
- Nếu bean implement interface "DisposableBean", phương thức "destroy()" sẽ được gọi.
28. Phương thức nào là quan trọng nhất trong Spring Bean lifecycle
Có hai phương thức quan trọng nhất trong Spring bean lifecycle. Đầu tiên là "setup()", phương thức này được gọi khi bean được load vào container. Phương thức thứ hai là "teardown()", phương thức này được gọi khi bean được unload khỏi container.
29. Inner bean trong Spring
Inner bean là một bean chỉ được sử dụng như một thuộc tính của một bean khác. XML-based configuration metadata cho phép ta sử dụng nested tag hoặc tag để khai báo inner bean. Inner bean luôn luôn là ẩn danh và scope của chúng luôn là "prototype".
30. Làm sao để inject Java Collection trong Spring?
Spring cung cấp các loại collection sau để inject:
- List: dùng để inject danh sách, có thể có các phần tử trùng nhau.
- Set: dùng để inject tập hợp, các phần tử không trùng nhau.
- Map: dùng để inject cặp key-value, trong đó key và value có thể là bất kỳ kiểu dữ liệu nào.
- Properties: dùng để inject cặp key-value, trong đó key và value đều là String.
31. Bean wiring là gì?
Bean wiring là trường hợp các bean được kết hợp lại trong Spring container. Khi wiring bean, Spring container cần biết những bean nào cần và làm thế nào để container sử dụng dependency injection để nối tất cả chúng lại với nhau.
32. Bean auto wiring là gì?
Bean auto wiring là khả năng tự động nối các bean trong Spring container. Spring sẽ tự động giải quyết các dependency bằng cách xem xét các đối tượng bean và metadata của chúng.
33. Các mode auto wiring
Autowiring có năm mode được sử dụng để hướng dẫn Spring container autowire các dependency injection:
- "no": đây là điều chỉnh mặc định, bean tham chiếu sẽ được khai báo rõ ràng khi config.
- "byName": khi autowiring theo tên, Spring container sẽ cố gắng khớp tên bean với giá trị được khai báo trong file config.
- "byType": khi autowiring theo kiểu dữ liệu, Spring container sẽ cố gắng khớp chính xác với tên của bean trong file config. Nếu có nhiều hơn một, lỗi sẽ được thông báo.
- "constructor": mode này tương tự như "byType", nhưng áp dụng cho các constructor argument. Nếu không tìm thấy kết quả phù hợp, lỗi sẽ được thông báo.
- "autodetect": Spring sẽ cố gắng autowire bằng cách sử dụng constructor, nếu không sẽ fallback sang autowire theo kiểu dữ liệu.
34. Hạn chế của autowiring
Có một số hạn chế của autowiring:
- "Overriding": vẫn có thể định nghĩa các dependency bằng cách khai báo rõ ràng và điều này sẽ ghi đè lên autowiring.
- "Data types": không thể autowire các thuộc tính đơn giản như kiểu dữ liệu nguyên thủy, String và Classes.
- "Confusing": autowiring không rõ ràng, vì vậy sử dụng khai báo rõ ràng có thể là cách thông minh hơn.
35. Có thể inject null hoặc empty String trong Spring hay không?
Có thể.
Spring Annotations
36. Java-based configuration
Java-based configuration cho phép chúng ta viết cấu hình Spring mà không cần sử dụng XML, thay vào đó sử dụng các annotation trong Java. Annotation cung cấp cách thức đơn giản để khai báo và cấu hình các thành phần trong ứng dụng.
37. Annotation-based configuration
Annotation-based configuration là một phương pháp thay thế XML để cấu hình ứng dụng Spring. Thay vì sử dụng XML để mô tả một bean, ta di chuyển cấu hình vào các class component bằng cách sử dụng annotation trong class, method hoặc field của class đó.
38. Làm sao cài đặt autowiring?
Mặc định, Spring container không enable autowiring dựa trên annotation. Để sử dụng autowiring dựa trên annotation, ta cần enable nó trong cấu hình Spring bằng cách thêm tag
39. @Required annotation
Annotation này đánh dấu rằng thuộc tính của bean phải được cài đặt khi config, thông qua autowiring hoặc khai báo rõ ràng. Nếu không cài đặt thuộc tính của bean, container sẽ throw BeanInitializationException.
40. @Autowired annotation
@Autowired annotation cung cấp phương thức autowiring cho bean. Nó có thể được sử dụng để autowire bean trong setter method như @Required annotation, trong constructor, property hoặc method với một hoặc nhiều argument.
41. @Qualifier annotation
Khi có nhiều hơn một bean cùng kiểu và chỉ có một bean cần được autowire vào một thuộc tính nào đó, @Qualifier được sử dụng với @Autowired để định danh rõ ràng bean cần autowire.
Trong phần tiếp theo, chúng ta sẽ tiếp tục nói về Spring Data Access, Aspect Oriented Programming (AOP), và Spring MVC. Hẹn gặp bạn trong bài viết tiếp theo!
Ảnh: