Sử dụng ApplicationContextAware và BeanNameAware trong Spring

Chúng ta đã biết cách làm thế nào để lấy một đối tượng từ Spring container bằng phương thức getBean() nhưng đôi khi chúng ta lại có nhu cầu ngược lại. Nghĩa là chúng ta muốn sử dụng Spring container trong đối tượng của mình để có thể truy cập vào các đối tượng khác trong container của nó. Vậy có cách nào để làm điều đó không?

Xin nói với các bạn rằng, Spring cũng hỗ trợ chúng ta làm điều đó. Bằng cách hiện thực interface ApplicationContextAware, đối tượng của chúng ta sẽ sử dụng được Spring container.

Hãy thử làm một ví dụ để xem nó như thế nào nhé!

Sử dụng ApplicationContextAware và BeanNameAware trong Spring

Trong ví dụ này mình có một ứng dụng quản lý các lớp học.

Ở đây mình sẽ khai báo hai lớp học trong Spring container. Bean id của mỗi lớp học chính là tên của lớp học đó. Như bên dưới:

Giờ mình có nhu cầu từ lớp học A mình cần biết tên của lớp học B trong Spring container. Để làm được điều này mình cần phải truy cập vào được Spring container từ lớp học A trước. Hãy thêm code hiện thực interface ApplicationContextAware như bên dưới nhé các bạn:

OK, bây giờ từ lớp A chúng ta có thể lấy được đối tượng của lớp B rồi đấy các bạn:

Đến đây chắc có lẽ một số bạn sẽ thắc mắc tại sao chỉ cần hiện thực interface ApplicationContextAware thì đối tượng lớp A có thể gọi được Spring container. Mình xin trả lời là Spring sử dụng đoạn code sau để tự động đưa Spring container vào đối tượng cần.

Các bạn thấy đó, bất kỳ đối tượng nào là thể hiện của interface ApplicationContextAware thì trong quá trình runtime, đối tượng đó sẽ được tự động gán Spring container vào, ở đây là ApplicationContext.

Bây giờ trở lại với nhu cầu của chúng ta là lấy tên của lớp B nhé các bạn.

Để có thể dùng bean id làm tên của đối tượng lớp B, chúng ta cần hiện thực interface BeanNameAware cho đối tượng này. Code sẽ như sau nhé các bạn:

Khi đó, để lấy tên của lớp B, chúng ta chỉ cần làm như sau:

Kết quả:

Sử dụng ApplicationContextAware và BeanNameAware trong Spring

2.5/5 - (2 bình chọn)

One thought on “Sử dụng ApplicationContextAware và BeanNameAware trong Spring

Add Comment