Dependency Injection và Inversion of Control trong Spring Framework

Dependency Injection và Inversion of Control trong Spring Framework là hai khái niệm khá trừu tượng và khó hiểu kể cả các lập trình viên mới và cố kinh nghiệm.Hiện có rất nhiều bài viết về Dependency Injection và Inversion of Control,mỗi người lại có một cách giải thích khác nhau.Tuy nhiên ở bài này,mình sẽ giải thích và tổng hợp cũng như cố gắng để các bạn dễ hiểu về hai khái niệm Dependency Injection và Inversion of Control này.

 

ioc-dependency injection


Khái niệm Dependency Injection và Inversion of Control

1.Inversion of control (IOC)

Inversion of control hay viết tắc của IOC đó chính là khả năng của Spring container trong việc quản lý các thành phần, khi mà thay vì một thành phần phải tự đòi hỏi các tài nguyên cho nó, thì nó sẽ được Spring container cung cấp các tài nguyên dựa vào thông tin trong file cấu hình.

2. Dependency Injection (DI)

Dependency Injection hay viết tắt của DI,là khả năng liên kết giữa các thành phần lại với nhau trong Spring, đó chính là việc các thuộc tính trong một đối tượng được “tiêm chích” để tham chiếu lần lượt đến các đối tượng khác được quản lý bởi Spring container.


Với Dependency Injection thì một đối tượng sẽ không phụ thuộc và đối tượng khác và đối tượng khác cũng vậy. Khi cần đối tượng này sẽ gọi tới đối tượng kia và ngược lại. Và mình đã hỏi các bạn, các đối tượng sẽ được tạo ra và nằm ở đâu để khi cần chúng có thể gọi lẫn nhau. Câu trả lời là chúng ta phải có một khung chứa, và khung chứa đó chính là một phần của IoC.

Ví dụ

Ví dụ về Dependency Injection

Để các bạn có thể hiểu hơn về DI mình sẽ viết một ví dụ như sau :

Đây là cách bạn tạo sự phụ thuộc đối tượng trong các chương trình truyền thống:

public class Store {
    private Item item;
  
    public Store() {
        item = new ItemImpl1();    
    }
}

Trong ví dụ trên, bạn có thể thấy rằng,để nhanh chóng sự phụ thuộc item  của đối tượng Store, bạn phải xác định việc thực hiện giao diện Item nào chúng ta sẽ sử dụng trong lớp Store .

Bằng cách sử dụng DI, chúng ta có thể viết lại ví dụ mà không nêu rõ việc thực hiện của Item mà chúng ta muốn:

public class Store {
    private Item item;
    public Store(Item item) {
        this.item = item;
    }
}

Việc triển khai Item được Injection (tiêm) sẽ được cung cấp thông qua metadata.

phan-biet-setter-va-constructor-injection-trong-spring
phan-biet-setter-va-constructor-injection-trong-spring

Với Dependency Injection (DI) thì chúng ta có hai cách để Injection data.Đó chính là :

  • Setter Injection

  • Constructor Injection

Để hiểu rõ hơn về khái niệm này,các bạn có thể đọc bài viết chi tiết tại đây. 

Chúng ta sẽ cùng nhau tìm hiểu về ví dụ hai khái niệm trên :

  • 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 Constructor 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.

Tổng kết :

Qua những khái niệm và ví dụ trên,bạn đọc cũng đã hiểu hơn về Dependency Injection và Inversion of Control trong Spring Framework.Hy vọng sẽ giúp ích cho các bạn ứng dụng và phát triển các project sau này.Share bài viết để mọi người cùng đọc nhé.

 

 

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận
x