IoC là gì? Tìm hiểu khái niệm Inversion of Control trong Spring

IoC là gì? Tìm hiểu khái niệm Inversion of Control trong Spring

Với những bạn với tiếp cận công việc developer và chưa có nhiều kinh nghiệm trong lĩnh vực này chắc hẳn đang rất hoang mang về khái niệm Inversion of Control (IoC). Để hiểu rõ thuật ngữ IoC là gì và cách áp dụng nó với Spring, bạn hãy tham khảo ngay bài viết sau đây để có được những thông tin chi tiết nhất. 

IoC là gì?

IoC còn có tên gọi đầy đủ là Inversion of Control, được hiểu là một nguyên lý thiết kế ứng dụng trong công nghệ phần mềm. Kiến trúc phần mềm khi áp dụng nguyên lý thiết kế này sẽ đảo ngược quyền điều khiển so với kiểu lập trình hướng thủ tục. Nếu như trong lập trình hướng thủ tục, các đoạn mã được thêm vào sẽ gọi các thư viện thì ở IoC lại hoàn toàn khác. Những IoC container sẽ chích những dependencies khi khởi tạo bean.

IoC là gì

IoC là gì?

Đây là khái niệm rất trừu tượng, không phải ai cũng hoàn toàn có thể hiểu được khi mới tiếp cận và cách để bạn hiểu được nó đó là trau dồi thêm kinh nghiệm tay nghề cho bản thân mình .

Một số thuật ngữ liên quan khác

Spring IoC Container là gì?

Spring IoC Container được chịu nghĩa vụ và trách nhiệm bởi Interface org.springframework.context. ApplicationContext. Đồng thời, phụ trách nhiệm vụ thông số kỹ thuật – configuration, setup – installation và tập hợp – assembling hàng loạt object beans cho Spring IoC Container .
Spring mang đến 2 tùy chọn implementation cho ApplicationContext interface là :

  • FileSystemXmlApplicationContext và ClassPathXmlApplicationContext vận dụng cho ứng dụng độc lập
  • WebApplicationContext sử dụng cho những ứng dụng web

Dependency Injection- DI là gì?

Đây là một pattern dùng để implement IoC, những dependencies sẽ được inject vào module trong quy trình khởi tạo .

Dependency Injection- DI là gì

Dependency Injection – DI

Cách tạo 1 dependency object trong truyền thống cuội nguồn như sau :
public class TraditionalStore {
private Item item ;
public TraditionalStore ( ) {
item = new ItemImplOne ( ) ;
}
}

Khi sử dụng chiêu thức DI, tất cả chúng ta hoàn toàn có thể viết lại chúng như sau :

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

Constructor Dependency Injection

Trong đây, Spring container sẽ gọi 1 constructor cùng những arguments đại diện thay mặt cho những dependencies. Chẳng hạn như ở thông số kỹ thuật dưới đây :

@ Configuration
public class StoreConfiguration {
@ Bean
public Item itemOne ( ) {
return new ItemImplOne ( ) ;
}
@ Bean DIStore store ( ) {
return new DIStore ( itemOne ( ) ) ;
}
}

Trong đó:

  • @ Configuration : là 1 class nguồn của bean đã được định nghĩa bên trong
  • @Bean: dùng để định nghĩa 1 bean trên từng method

Một ví dụ khác về thông số kỹ thuật bean khi sử dụng XML configuration như sau :

  

Field Dependency Injection

Bạn hoàn toàn có thể sử dụng cách khác để khởi tạo 1 bean cho ứng dụng đó là thêm @ Autowired như trong ví dụ dưới đây :

public class AutowiredStore {
@ Autowired
private Item item ;
}

Trong quy trình khởi tạo AutowiredStore, trong trường hợp không có method hoặc constructor nào để inject Item bean, thì Spring sẽ sử dụng reflection để inject Item vào trong .
Đây là cách khởi tạo 1 bean vô cùng thuận tiện, tuy nhiên nó lại sống sót 1 số ít yếu tố nên chiêu thức này không được khuyến khích sử dụng nhiều .

Lazy Initialized Bean

Ở chính sách mặc định, khi startup application, Spring container sẽ tự động hóa khởi tạo và thông số kỹ thuật hàng loạt Singleton beans. Nếu bạn không thích điều này, mà chỉ muốn khởi tạo bean khi có request, thì hoàn toàn có thể sử dụng lazy-init attribute như sau :


Autowiring Dependencies

Autowiring được cho phép container tự động hóa xử lý những dependencies giữa những beans trải qua việc kiểm tra những bean đã được định nghĩa. Có 4 loại để autowiring một bean như sau :

Autowiring Dependencies

Autowiring dependencies trong spring 

  • No: là giá trị mặc định, nó không sử dụng autowiring cho bean mà bạn phải chỉ rõ tên của những dependencies .

  • byName: Autowiring được triển khai nhờ vào tên của thuộc tính. Spring container sẽ làm trách nhiệm tìm kiếm 1 bean có sẵn trong name sao cho có name trùng với name của thuộc tính .

  • byType: Autowiring triển khai dựa vào kiểu thuộc tính, Spring container sẽ tìm kiếm 1 bean cùng loại với thuộc tính đó. Trong trường hợp có nhiều hơn 1 bean cùng loại, spring sẽ lập tức throw 1 exception .

  • constructor: Autowiring dựa trên constructor arguments meaning. Spring container sẽ tìm kiếm beans có loại giống với loại của constructor arguments .

Sử dụng @ Autowired annotation để tạo @ Qualifer và bean byType như sau :

public class AutowiringStore {
@ Autowired
@ Qualifier ( “ itemTwo ” )
private Item item ;
}

Sau đó, inject bean item vào item property của storeOne bean bằng cách sau:

Trên đây là chia về Inversion of Control – IoC là gì và một số thuật ngữ liên quan khác. Nếu bạn mới ra trường, mới đi làm mà vẫn còn cảm thấy hoang mang về những khái niệm này thì cũng đừng quá lo lắng nhé. Bởi đây đều là những thuật ngữ mà không phải ai cũng có thể hiểu nhanh chóng. Bạn cần có nhiều thời gian để tiếp cận và nghiên cứu thì mới có thể hiểu hết được về chúng. 

Rate this post