Trong bài viết trước, mình đã giới thiệu với các bạn cơ bản về Setter Injection trong Spring sử dụng tập tin XML. Trong bài viết này, mình xin đề cập về nó một cách chi tiết hơn để các bạn có thể sử dụng nó một cách dễ dàng các bạn nhé!
Hãy xem xét ví dụ sau:
Mình có class Student:
1 2 3 4 |
package com.huongdanjava.springsetterinjection; public class Student { } |
và class Clazz có nội dung như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com.huongdanjava.springsetterinjection; public class Clazz { private String name; private Student student; public String getName() { return name; } public void setName(String name) { this.name = name; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } @Override public String toString() { return "Clazz [name=" + name + ", student=" + student + "]"; } } |
Như các bạn thấy, class Clazz của mình có chứa hai thuộc tính: một biến của đối tượng Student, một biến kiểu dữ liệu String và các phương thức Setter để gán giá trị cho các biến này. Vậy làm thế nào để chúng ta inject các đối tượng kiểu dữ liệu này vào class Clazz sử dụng các phương thức Setter này? Các bạn hãy đọc tiếp nhé!
Trước tiên, mình sẽ tạo một Maven project trước:
Class Application có nội dung như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.huongdanjava.springsetterinjection; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Application { public static void main(String[] args) { BeanFactory context = new ClassPathXmlApplicationContext("spring.xml"); Clazz clazz = (Clazz) context.getBean("clazz"); System.out.println(clazz.toString()); } } |
Mình sẽ sử dụng Java 17 cho ứng dụng ví dụ này:
1 2 3 4 |
<properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> |
Spring dependency:
1 2 3 4 5 |
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.2</version> </dependency> |
Ok, bắt đầu nào các bạn.
Để inject đối tượng Student vào đối tượng Clazz, trước tiên chúng ta cần khởi tạo đối tượng Student trong khung chứa của Spring trước!
1 |
<bean id="student" class="com.huongdanjava.springsetterinjection.Student" /> |
Và giờ để khai báo đối tượng Clazz trong khung chứa của Spring mình sẽ khai báo như sau:
1 2 3 4 |
<bean id="clazz" class="com.huongdanjava.springsetterinjection.Clazz" > <property name="name" value="Khanh" /> <property name="student" ref="student" /> </bean> |
Trong khai báo cho đối tượng Clazz trên, mình đã sử dụng thẻ <property> với các cặp thuộc tính là <name, value> và <name, ref>. Trong đó:
- Thuộc tính name là bắt buộc, nó là tên của thuộc tính mà chúng ta cần inject trong đối tượng Clazz.
- Còn thuộc tính value hay ref thì giống như trong Constructor Injection. Thuộc tính value được sử dụng trong trường hợp giá trị inject là một giá trị text, số hoặc là boolean,… Còn thuộc tính ref thì được sử dụng để reference tới một bean khác đã được khởi tạo trong khung chứa của Spring.
Kết quả:
Ngoài ra, tương tự như Constructor Injection, Spring còn hỗ trợ chúng namespace p dùng để khai báo cho Setter Injection một cách đơn giản hơn.
Namespace này cho phép chúng ta có thể khai báo các thuộc tính của các đối tượng ngay trong thẻ <bean> dưới dạng là một thuộc tính. Nó không đi kèm một tập tin schema XSD, do đó để sử dụng namespace p, các bạn chỉ cần khai báo nó trong tập tin cấu hình XML của Spring như sau:
1 2 3 4 5 6 7 |
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans> |
rồi sử dụng syntax sau để inject các đối tượng phụ thuộc.
Các bạn hãy khai báo một thuộc tính trong thẻ <bean> với name bắt đầu là “p:” tiếp theo là tên thuộc tính của đối tượng Clazz và kết thúc là “-ref” nếu đối tượng phụ thuộc là một bean khác trong khung chứa của Spring, sau đó gán cho nó một giá trị. Ví dụ mình có thể khai báo đối tượng Clazz như sau:
1 |
<bean id="clazz" class="com.huongdanjava.springsetterinjection.Clazz" p:name="Khanh" p:student-ref="student" /> |
Kết quả:
Cương
E muốn theo javaweb, ở trường e đã học được JSP, Servlet. E có được dạy thêm về framework Struts2 nhưng e thấy làm ko hợp so với mình chỉ làm bằng jsp + servlet, Nên e đã quyết định tìm hiểu Spring framework nhưng tìm hoài ko thấy tài liệu hướng dẫn hoặc rất chung chung cho đến khi tìm được đến trang web này của a. Bài hướng dẫn của a rất chi tiết và dễ hiểu, mong a ra nhiều series hay về java hơn. Nếu được e xin a tư vấn thêm về lộ trình học javaweb với Spring framework nên đi từ đâu khi đã có kiến thức về java, jsp servlet ạ, E cảm ơn a nhiều !
Khanh Nguyen
Thanks em. Anh nghĩ nếu em đọc và hiểu hết những bài viết của anh trên Hướng Dẫn Java thì cũng đã có những kiến thức nền cơ bản và có thể làm việc được luôn đó.
bkhn56
Theo em hiểu thì thuộc tính name bản chất nó là tên của setter anh ạ
Khanh Nguyen
Giá trị của thuộc tính name mới là tên của setter bỏ đi chữ set, em nhỉ?
Thieunguyen
Thanks for question and awesome answer!!!