Phân biệt Setter và Constructor Injection trong Spring

Spring hỗ trợ hai loại phụ thuộc Injection, sử dụng phương thức setter và constructor. Phân biệt giữa Setter và Constructor Injection trong spring cũng là một trong những câu hỏi phỏng vấn cổ điển.Trong bài viết này không chỉ giúp bạn hiểu Setter vs Constructor Injection mà còn nói lên quy trình tiêm phụ thuộc,cách sử dụng của Spring.

Phân biệt giữa Setter và Constructor Injection trong Spring

 

Setter Injection Constructor Injection
1. Khi sử dụng Setter Injection,nó tiêm một phần phụ thuộc có thể có thể, có nghĩa là nếu chúng ta có 3 thuộc tính như int, string, float, thì sau này muốn sử dụng nó chúng ta không cần thiết phải tiêm (truyền) tất cả các giá trị nếu chúng ta sử dụng setter injection. Nếu bạn không tiêm nó sẽ mất giá trị mặc định cho những đối số nguyên thủy.(ví dụ như int thì mặc định sẽ bằng 0…) 1. Khi sử dụng constructor injection,tiêm một phần phụ thuộc là không thể, bởi vì để gọi constructor chúng ta phải vượt qua tất cả các đối số, nếu không truyền đầy đủ các đối số thì sẽ nhận được lỗi.
2. Tiêm Setter sẽ ghi đè giá trị constructor injection, cung cấp nếu chúng ta viết setter injection và nhà xây dựng cho các tài sản cùng [tôi đã nói về việc này, hy vọng bạn nhớ] 2. Nhưng, constructor injection không thể ghi đè các setter tiêm các giá trị
3. Nếu chúng ta có nhiều thuộc tính ví dụ 10-20 đang có trong lớp bean của chúng ta, trong trường hợp sử dụng setter Injection này không được khuyến khích vì như vậy chúng ta cần phải viết gần 20 setters,code của chúng ta rất dài. 3. Trong trường hợp này, tiêm Constructor là rất khuyến khích, như chúng ta có thể tiêm tất cả các phụ thuộc với trong 3-4 dòng [có nghĩa là, bằng cách gọi một constructor]
4. Sử dụng Injection Setter làm cho đối tượng lớp bean như có thể thay đổi [Chúng ta có thể thay đổi] 4. Ngược lại,Constructor Injection  làm cho đối tượng lớp bean như là bất biến [Chúng ta không thể thay đổi]

Cách áp dụng giữa Setter và Constructor Injection trong Spring

  • Sử dụng Setter Injection

User.java

package entites;


public class User  {
	
	private int id_user;
	private String username;
	private String password;
	
	public int getId_user() {
		return id_user;
	}
	public void setId_user(int id_user) {
		this.id_user = id_user;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	
}

mvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
      http://www.springframework.org/schema/beans    
      http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
      http://www.springframework.org/schema/context
      ">
 
	<context:annotation-config />
	<context:component-scan base-package="controller" />
	<bean id="jspviewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>
	
	<bean id="user1" class="entites.User">
		<property name="username" value="itphutran"></property>
	</bean> 
	
</beans>

TestController.java

package controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import entites.User;

@Controller
public class TestController {
 @Autowired
 private User user;
 
 @RequestMapping(value ="/test", method = RequestMethod.GET)
 public String login() {
 System.out.println(user.getUsername());
 System.out.println(user.getPassword());
 return "";
 }
}

Output: itphutran null

  • Sử dụng Setter Injection

Tương tự chúng ta cũng có những file cấu hình trên,tuy nhiên cần phải thay đổi trong file mvc-dispatcher-servlet.xml.

 mvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
      http://www.springframework.org/schema/beans    
      http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
      http://www.springframework.org/schema/context
     ">
 
	<context:annotation-config />
	<context:component-scan base-package="controller" />
	<bean id="jspviewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>
	
	<bean id="user1" class="entites.User">
		<constructor-arg type="int" value="1" ></constructor-arg>
		<constructor-arg type="String" value="itphutran" name="username" ></constructor-arg>
		<constructor-arg type="String" value="password" name="password" ></constructor-arg>
	</bean>
</beans>

Output:1, itphutran ,password.

Trên thực tế, có thể có một số khác biệt  và rất nhiều, nhưng đây là những gì tôi tìm thấy tối đa kiến ​​thức của tôi :).Hy vọng giúp một phần nào đó các bạn hiểu vệ sự khác biệt này.Nếu tìm thấy ra những sự khác biệt mới các bạn comment bên dưới bài viết nhé.

 

Kết Luận :

Tóm lại, cả Setter và Constructor Injection đều có lợi thế của riêng nó. Những quan trọng là trong Spring  nó không hạn chế bạn sử dụng hoặc tiêm Setter hoặc Constructor Injection và bạn có thể tự do sử dụng cả hai chúng trong một file cấu hình Spring. Sử dụng tiêm Setter khi một số phụ thuộc nhiều hơn hoặc bạn cần dễ đọc. Sử dụng Constructor để tiêm khi đối tượng phải được tạo ra với tất cả các phụ thuộc của nó.

 

 

x