Trong bài viết này bọn họ sẽ cùng nhau tò mò các tư tưởng của IoC (Inversion of Control) cùng DI (Dependency Injection). Cùng sau đó bọn họ xem phương pháp Spring framework triển khai các khái niệm này ra làm sao nha.

Bạn đang xem: Ioc là gì

Bạn đã xem: Ioc là gì

Inversion of Control là gì?

Nhắc lại loài kiến thức

Trước lúc bắt đầu, chúng ta cần ghi nhớ lại phép tắc Dependency Inversion trong SOLID phát biểu rằng:

Các module v.i.p không nên nhờ vào vào module cấp thấp, cả hai nên dựa vào vào interface.Các class tiếp xúc với nhau trải qua interfce, chưa hẳn thông qua implementation

Trong lập trình truyền thống, các module cấp cao sẽ điện thoại tư vấn đến các module cấp cho thấp. Do đó những module cấp cao sẽ dựa vào và các module cấp cho thấp, điều này tạo ra những dependency. Khi các module cấp thấp thay đổi thì các module cấp cao yêu cầu phải chuyển đổi theo, bởi thế sẽ làm tăng tính phức hợp của code và cạnh tranh để bảo trì.


*

Nếu vận dụng Dependency Inversion, những module sẽ tiếp xúc với nhau trải qua interface, cả module v.i.p và cấp thấp sẽ không phụ thuộc lẫn nhau mà phụ thuộc vào vào interface. Ta rất có thể dễ dàng thay thế sửa chữa các implementation của các module cấp thấp miễn là chúng đều thực thi một interface.

Như vậy IoC là một trong những design pattern được tạo nên nhầm tuân thu nguyên tắc Dependency Inversion. Chúng ta cũng có thể triển khai IoC thông qua các cách thức như Strategy design pattern, Service Locator pattern, Factory pattern, và Dependency Injection (DI).

Kiến trúc này sẽ mang đến những lợi ích:

Tách bạch phần tiến hành và phần thực hiện của một tác vụ.Dễ dàng đổi khác giữa các implementation của cùng một interface.Tăng tính modun hoá đến chương trình.Dễ dàng kiểm demo chương trình bằng cách cô lập một component hoặc trả lập các dependency của chính nó và chất nhận được component tiếp xúc thông qua các kịch bạn dạng dựng sẵn.

Phần tiếp theo bọn họ sẽ khám phá Dependency Injection một trong những cách giúp họ triển khai IoC hiệu quả.

Dependency Injection là gì?

Dependency injection – DI cũng là 1 trong design pattern được áp dụng để thực hiện IoC, trong số đó quyền kiểm soát điều hành các dựa vào của một object sẽ bị đảo ngược và nó không được quyền cai quản lý. Việc kết nối giữa những object được triển khai bởi một trình quản lý thay vày tự thân chúng kết nối với nhau.

Để làm rõ hơn, dưới đó là cách các bạn tạo một object

public class Store private thành quả item; public Store() cống phẩm = new ItemImpl1(); Trong ví dụ trên bọn họ cần khởi tạo ra một implementation của thắng lợi interface bên phía trong Store class.

Nếu sử dụng DI, chúng ta cũng có thể triển khai Store class lại như sau mà không buộc phải khởi chế tạo ra một thành phầm implementation.

public class Store private cửa nhà item; public Store(Item item) this.item = item; IoC và DI là 2 khái niệm cơ bạn dạng giúp mã mối cung cấp của họ trở đề nghị dễ đọc và dễ gia hạn hơn. Bởi vì vậy Spring framework đã tích hợp sẵn DI vào đó.

Spring IoC Container 

IoC container là trong số những khái niệm cần sử dụng chung cho những framework tiến hành Inversion of Control – IoC.

Trong Spring, IoC container được đại diện bởi ApplicationContext interface. Spring container phụ trách khởi tạo, thông số kỹ thuật và đính ráp những object được nghe biết là các Bean trong Spring, nó cũng thống trị luôn vòng đời của chúng.

Spring hỗ trợ một số cách thực hiện ApplicationContext interface như trải qua ClassPathXmlApplicationContext FileSystemXmlApplicationContext cho các ứng dụng độc lập và WebApplicationContext cho những ứng dụng web.

Để gắn ráp những Bean trong ứng dụng, container đã sử dụng các metadata được thông số kỹ thuật ở dạng XML hoặc annotation.

Dưới đấy là một cách thủ công để chế tạo ra một Spring container

Dependency Injection vào Spring có thể thực hiện trải qua constructor, setter, fields mà chúng ta sẽ tìm hiểu ở đều phần sau.

Constructor-Based Dependency Injection

Trong ngôi trường hợp sử dụng constructor-dependency-injection (tiêm các dependency của một class trải qua constructor) thì container sẽ call constructor với các tham số đại diện thay mặt cho những dependency mà bọn họ muốn. 

Như vậy các bạn thấy câu hỏi khởi tạo nên và thống trị các dependency giờ đây không phải do Class áp dụng chúng cai quản mà ở trong về container.

Bean annotation được áp dụng trên những method có mang ra một Bean. Nếu họ không chỉ định tên của Bean thì tên khoác định của nó là tên gọi hàm.

Mỗi Bean chỉ được sống thọ một object trong container. Spring sẽ kiểm soát nếu vẫn tồn trên một object của một Bean vào container thì nó sẽ không khởi chế tác lại, trái lại một object sẽ tiến hành tạo new và cung ứng container.

Setter-Based Dependency Injection

Đối cùng với setter-dependency-injection thì những dependency thì được tiêm vào class của họ thông qua setter method.

Ví dụ sau khi khởi tạo Item Bean chúng ta có thể khởi tạo ra Store với thắng lợi Bean đang khởi tạo thành trước đó.

Beanpublic Store store() Store store = new Store(); store.setItem(item1()); return store;Hoặc thông số kỹ thuật XML như sau:

Field-BasedDependency Injection

Đối với trường hợp thực hiện Field-Based DI, bọn họ sẽ tiêm những dependency của class trải qua Autowired private thắng lợi item; }Trong lúc khởi chế tác một object Store, nếu không tồn tại constructor hoặc setter nào để tiêm thành tích bean vào, container sẽ sử dụng reflection để mang Item vào Store.

Cách tiếp cận này rất có thể trông dễ dàng và đơn giản và gọn gàng hơn nhưng mà không được khuyến khích sử dụng vì nó có một số nhược điểm như:

Phương pháp này thực hiện reflection để đưa vào những dependency, tốn nhát hơn đối với tiêm dựa vào constructor hoặc setter.

Autowiring Dependencies

Autowire chất nhận được Spring container auto giải quyết các dependency theo 4 kế hoạch sau:

no – cực hiếm mặc định, nghĩa là không có cơ chế nào của Autowire được hỗ trợ và bạn phải chỉ định tên của các dependency một cách rõ ràng.byName –
Spring container vẫn tìm kiếm một bean với thương hiệu trùng với thương hiệu của trực thuộc tính mà chúng ta đặt trong class.constructor – Spring container đã tìm kiếm các dependency phụ thuộc các thông số trên constructor gồm cùng kiểu dữ liệu với những thuộc tính khai báo vào class.

Ví dụ autowire item1 bean trong store bean.

Bean(autowire = Autowire.BY_TYPE)public class Store private nhà cửa item; public setItem(Item item) this.item = item; Chúng ta cũng hoàn toàn có thể làm việc này với Qualifier("item1") private công trình item;}

Lazy Initialized Bean

Mặc định thì Spring container sẽ khởi tạo và cấu hình tất cả những bean tại thời gian khởi chạy chương trình. Còn nếu không muốn, chúng ta cũng có thể chỉ định ở trong tính lazy-init bên trên bean cơ mà bạn không muốn tạo ban đầu.

Xem thêm: Giải Bài Tập Địa Lí 11 Bài 8 Tiết 2, Bài 8: Liên Bang Nga (Kinh Tế)

Kết bài

Có vẽ đông đảo khái niệm trên hơi nặng nề, trong cả những fan mới đi làm việc hoặc làm tầm 1-2 năm cũng khá khó nhằm hiểu. Nên các bạn cũng chớ bở tưởng nhé, cứ đọc để sở hữu khái niệm trước cũng được, ung dung nó ngấm. Dưới là những tài liệu mình tham khảo các bạn có thể vào kia để mày mò kỹ hơn.

Nguồn tham khảo

https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/beans.html

Dependency Injection và Inversion of Control – Phần 1: Địnhnghĩa

https://www.baeldung.com/inversion-control-and-dependency-injection-in-spring#autowiring-dependencies