Ngoài cách khởi tạo bean trong khung chứa của Spring sử dụng tập tin XML hoặc sử dụng annotation @Configuration, chúng ta còn có thể khởi tạo bean bằng cách sử dụng cơ chế auto component scan của Spring. Cụ thể cách này như thế nào, mình sẽ nói cho các bạn biết trong bài viết này nhé!
Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ như sau:
Tiếp theo, mình sẽ thêm Spring dependency vào tập tin pom.xml như sau:
1 2 3 4 5 |
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.2</version> </dependency> |
Bây giờ, mình sẽ thêm một class mới HelloWorld nằm trong package com.huongdanjava.springcomponentscan:
với nội dung như sau:
1 2 3 4 5 6 7 8 |
package com.huongdanjava.springcomponentscan; public class HelloWorld { public void print() { System.out.print("Hello World!"); } } |
Để sử dụng cơ chế auto component scan trong Spring, có 2 bước chúng ta cần phải làm như sau:
Bước thứ nhất, chúng ta phải khai báo một thẻ context:component-scan trong tập tin cấu hình của Spring.
Trong thẻ này, chúng ta có một thuộc tính tên là base-package. Khai báo tên package có chứa đối tượng mà chúng ta cần khởi tạo bean trong khung chứa của Spring vào thuộc tính này, Spring sẽ giúp ta tự động làm điều đó.
Trong ví dụ của mình, mình muốn Spring khởi tạo bean cho đối tượng HelloWorld một cách tự động thì mình sẽ khai báo thẻ context:component-scan như sau:
1 2 3 4 5 6 7 8 9 |
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.huongdanjava.springcomponentscan" /> </beans> |
Bước thứ hai, chúng ta cần làm đó là thêm một trong số những annotation sau vào đối tượng mà chúng ta muốn Spring tự động khởi tạo bean.
Các annotation đó là: @Component, @Repository, @Service và @Controller. Mỗi annotation có ý nghĩa khác nhau như sau:
– @Component: dùng cho những đối tượng không liên quan đến database, business logic hay presentation layer.
– @Repository: dùng cho những đối tượng liên quan đến database layer.
– @Service: dùng cho những đối tượng liên quan đến business logic layer.
– @Controller: dùng cho những đối tượng liên quan đến presentation layer.
Thật ra, bạn có thể sử dụng những annotation trên cho bất kỳ đối tượng nào. Nhưng để làm rõ hơn về mặt ngữ nghĩa cho từng đối tượng, các bạn nên sử dụng chúng cho phù hợp với mục đích.
Trong ví dụ của mình, đối tượng HelloWorld không liên quan gì đến database, business logic hay presentation layer nên mình sẽ sử dụng annotation @Component như sau:
1 2 3 4 5 6 7 8 9 10 11 |
package com.huongdanjava.springcomponentscan; import org.springframework.stereotype.Component; @Component public class HelloWorld { public void print() { System.out.print("Hello World!"); } } |
OK, xong rồi đó các bạn. Id của bean chính là tên của class với kí tự đầu là chữ thường nhé các bạn.
Bây giờ chúng ta thử chạy ví dụ này xem sao!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.huongdanjava.springcomponentscan; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Application { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld"); helloWorld.print(); } } |
Kết quả:
Trân Minh Quân
Mình thêm annotation @Bean cho những database, business logic hay presentation layer được k anh?.
Những annotation anh kể trên khác @Bean ở điểm nào anh?
Khanh Nguyen
Annotation @Bean là em khai báo bean một cách thủ công. Còn những annotation trên là Spring sẽ tự động tạo bean cho mình. Khác nhau em nhé!
ilovebka56
Câu này:” Bây giờ, mình sẽ thêm một đối tượng mới HelloWorld nằm trong package com.huongdanjava.springcomponentscan:” em thấy anh nên đổi thêm một “đối tượng” thành “class” thì sẽ hay hơn. cảm ơn anh vì những chia sẻ rất bổ ích.
Khanh Nguyen
Thanks bạn đã góp ý.
Đã sửa rồi nhé bạn!
Trịnh Đức Minh
Làm sao để có thể xác định được context.getBean(“helloWorld”);
Khanh Nguyen
Thanks bạn đã góp ý. Mình đã chỉnh sửa bài viết để làm rõ hơn chỗ này.