springuniverse

69 câu hỏi phỏng vấn về Spring (Phần 2)

Trong bài trước đã có bạn hỏi về cấu trúc các module trong Spring, đây chính là hình minh họa.

spring-overview.png

Trong phần này, chúng ta sẽ lần lượt nói về Spring Beans, Spring Annotations.

Spring Beans

21. Spring beans là gì?

Spring Beans chính là những Java Object mà từ đó tạo nên khung sườn của một Spring application.Chúng được cài đặt, lắp ráp và quản lý bởi Spring IoC container. Những bean này được tạo ra bởi configuration metadata được cung cấp từ container, ví dụ, trong tag <bean> nằm trong file XML.

Các bean được define trong spring framework là singleton bean. Có một thuộc trính trong bean với tên là “singleton” nếu được gán giá trị là true thì bean đó sẽ trở thành singleton, nếu là false thì bean đó sẽ trở thành prototype bean. Mặc định nếu không được định nghĩa giá trị của nó sẽ là true. Vì thế tất cả các bean trong spring framework mặc định sẽ là singleton bean.

22. Định nghĩa Spring bean gồm những gì?

Một Spring bean definition chứa tất cả các configuration metadata cái mà cần cung cấp cho container biết làm sao để tạo ra bean, cũng như chi tiết về lifecycle và những depedencies của nó.

23. Làm sao để cung cấp configuration metadata cho Spring Container?

Có ba cách để cũng 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 phải định nghĩa scope của bean. Việc định nghĩa scope có thể thực hiện thông qua việc sử dụng thuộc tính tên là “scope” khi định nghĩa. Lấy ví dụ, khi bean phải tạo mới mỗi lần cần sử dụng, thuộc tính scope sẽ là “prototype”. Mặt khác, khi bean luôn luôn trả về một instance giống nhau khi sử dụng, thuộc tính scope sẽ là “singleton”.

25. Các scope của bean

Spring framework đưa ra năm scope của bean như sau:

  • singleton: cho biết bean đó có một instance duy nhất trong Sping IoC container.
  • prototype: cho biết bean đó được định nghĩa là có nhiều object instances, mỗi lần muốn sử dụng sẽ tạo mới.
  • request: cho biết bean được định nghĩa với một HTTP request. Scope này chỉ hợp lệ khi chúng ta sử dụng Web Application Context.
  • session: cho biết bean được định nghĩa với một HTTP session. Scope này cũng chỉ hợp lệ khi chúng ta sử dụng Web Application Context.
  • global-session: cho biết bean được định nghĩa với một global HTTP session. Scope này cũng chỉ hợp lệ khi chúng ta sử dụng Web Application Context.

Scope mặc định của mọi Spring Bean là singleton.

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

  • Spring container tìm các bean definition trong file XML và khởi tạo các bean.
  • Spring cài đặt tất cả các thuộc tính được định nghĩa trong bean definition (Dependency Injection).
  • Nếu bean implement BeanNameAware interface, spring sẽ truyền bean id vào trong hàm setBeanName().
  • Nếu bean implement BeanFactoryAware interface, spring sẽ truyền beanfactory vào hàm setBeanFactory().
  • Nếu có bất cứ bean BeanPostProcessors nào được liên kết với bean đang khởi tạo, spring sẽ gọi hàm postProcesserBeforeInitialization() và postProcessAfterInitialization().
  • Nếu bean implement 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 DisposableBean interface, 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 nay đượ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.

Tag <bean> có hai thuộc tính quan trọng là init-methoddestroy-method với thuộc tính này, chúng ta có thể khai báo tùy biến phương thức khởi tạo và destroy cho mỗi bean. Ngoài ra nếu bạn sử dụng Annotation-based thì Spring framework cũng cung cấp hai annotation là @PostConstruct và @PreDestroy

29. Inner bean trong Spring

Khi mà bean chỉ được sử dụng như một thuộc tính của một bean khác thì nó được gọi là inner bean. XML-based configuration metadata cung cấp cho chúng ta sử dụng tag <bean> bên trong tag <property> hoặc <constructor-arg> để khai báo gọi inner bean. Inner bean luôn luôn là anonymous và scope của chúng luôn là prototype.

30. Làm sao để inject Java Collection trong Spring?

Spring đưa ra cho chúng ta các loại collection như sau:

  • <list> dùng để inject list, có thể có các phần tử trùng nhau.
  • <set> dùng để inject set, các phần tử không trùng nhau.
  • <map> dùng để inject collection dạng key-value, trong đó key và value là loại tùy ý.
  • <props> dùng để inject collection dạng key-value, trong đó key và value đều là String.

31. Bean wiring là gì?

Wiring, hoặc là Bean wiring là trường hợp mà 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ì?

Spring container có khả năng autowire quan hệ giữa các bean có mối quan hệ hợp tác với nhau. Spring sẽ giải quyết các mối quan hệ hợp tác bằng cách xem xét nội dụng của BeanFactory với các tag <constructor-arg> và <property>.

33. Các mode auto wiring

Autowiring có năm mode được sử dụng để hướng dẫn Spring container làm sao autowiring giải quyết dependency injection.

  • no: đây là default setting, bean tham chiếu sẽ được reference rõ ràng khi khai báo.
  • byName: khi autowiring byName, Spring container sẽ cố gắng match giá trị được khai báo trong bean với tên tương tự trong configuration file.
  • byType: khi autowiring bằng data type, Spring container sẽ cố gắng match chính xác với tên của bean trong configuration file. Nếu có nhiều hơn một, fatal exception sẽ được throw ra.
  • constructor: mode này tương tự với byType, nhưng type sẽ apply lên các constructor argument. Nếu không có kết quả nào phù hợp, thì fata exception cũng được throw ra.
  • autodetect: Spring sẽ cố gắng wire bằng cách sử dụng constructor, nếu không có nó sẽ fallback xuống sử dụng byType.

34. Hạn chế của autowiring

Các hạn chế của việc autowiring:

  • Overriding: vẫn có thể định nghĩa các dependencies bằng <constructor-arg> và <property> việc này sẽ luôn luôn override autowiring.
  • Data types: Không thể autowire những thuộc tính đơn giản như primitive, String và Classes.
  • Confusing: autowiring thì không tường minh, vì thế sử dụng khai báo tường minh có thể là cách khôn ngoan 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 Spring configuration mà không cần sử dụng XML, thay vào đó chúng ta sử dụng các Java-based annotation. Về Annotation trong Java các bạn có thể tìm đọc bài viết của tôi trong bài Hướng dẫn sử dụng Annotations.

37. Annotation-based configuration

Một phương thức thay thế cho việc setup application bằng XML là chúng ta cung cấp các annotation-based configuration dựa trên bytecode metadata cho việc wiring các component. Thay vì sử dụng XML để mô tả một bean, lập trình viên chuyển các configuration vào trong component class bằng cách sử dụng annotation trong class, method hay field của chính class đó.

38. Làm sao cài đặt autowiring?

Mặc định Spring container sẽ không enable annotation wiring. Để sử dụng annotation-based wiring chúng ta phải enable nó trong Spring configuration bằng tag <context:annotation-config>.

39. @Required annotation

Annotation này đơn giản chỉ ra rằng thuộc tính nào của bean phải được cài đặt tại thời điểm config, thông qua khai báo tường minh hay thông qua autowiring. Nếu những thuộc tính của bean không thể được cài đặt thì container sẽ throw BeanInitializationException.

40. @Autowired annotation

@Autowired annotation cung cấp phương thức wiring cũng như làm thế nào autowiring được hoàn thành. Nó có thể sử dụng autowire bean trong setter method như @Required annotation, trong constructor, trong property hoặc trong method nào đói với một hoặc nhiều argument.

41. @Qualifier annotation

Khi có nhiều hơn một bean với cùng một loại và chỉ có một bean trong số đó cần được wire với một property nào đó, @Qualifier sẽ được sử dụng với @Autowired để giảm thiểu sự nhầm lẫn bằng cách định danh chính xác bean nào được wire.

Trong bài cuối cùng chúng ta sẽ tiếp tục nói về Spring Data Access, Aspect Oriented Programming (AOP), Spring MVC.

Xin chào và hẹn gặp lại.

 

Advertisements

One thought on “69 câu hỏi phỏng vấn về Spring (Phần 2)

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s