Ioc Là Gì

  -  

Trong bài viết này họ sẽ bên nhau tò mò các tư tưởng của IoC (Inversion of Control) với DI (Dependency Injection). Và tiếp nối bọn họ coi giải pháp Spring framework xúc tiến các khái niệm này như thế nào nha.

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

Inversion of Control là gì?

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

Trước Lúc bắt đầu, chúng ta bắt buộc nhớ lại hình thức Dependency Inversion trong SOLID tuyên bố rằng:

Các module V.I.P không nên nhờ vào vào module cấp thấp, cả hai đề nghị phụ thuộc vào interface.Các class tiếp xúc cùng nhau thông qua interfce, không phải thông qua implementation

Trong lập trình truyền thống cuội nguồn, những module cấp cao đã điện thoại tư vấn đến những module thấp cấp. Như vậy phần lớn module V.I.P đã nhờ vào và các module thấp cấp, điều ấy tạo thành các dependency. Lúc những module cấp thấp thay đổi thì những module cao cấp buộc phải phải thay đổi theo, điều đó sẽ có tác dụng tăng tính phức hợp của code cùng nặng nề nhằm duy trì.

*

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

Bởi vậy IoC là 1 trong những design pattern được tạo thành nhầm tuân thu nguyên lý Dependency Inversion. Chúng ta hoàn toàn có thể tiến hành IoC trải qua những hiệ tượng nlỗi Strategy thiết kế pattern, Service Locator pattern, Factory pattern, cùng Dependency Injection (DI).

Kiến trúc này sẽ mang lại số đông lợi ích:

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

Phần tiếp sau chúng ta đang mày mò Dependency Injection một Một trong những phương pháp giúp bọn họ thực hiện IoC kết quả.

Dependency Injection là gì?

Dependency injection – DI cũng là một trong những thiết kế pattern được sử dụng để thực thi IoC, trong những số ấy quyền kiểm soát điều hành các phụ thuộc vào của một object sẽ ảnh hưởng đảo ngược và nó ko được quyền quản lý. Việc kết nối thân các object được thực hiện vày một trình thống trị thay bởi từ thân bọn chúng kết nối với nhau.

Để làm rõ hơn, bên dưới đây là phương pháp các bạn chế tạo một object

public class Store private Item item; public Store() vật phẩm = new ItemImpl1(); Trong ví dụ bên trên họ đề nghị khởi tạo một implementation của Item interface phía bên trong Store class.

Nếu thực hiện DI, bạn cũng có thể thực hiện Store class lại nlỗi sau mà không buộc phải khởi chế tạo một Item implementation.

public class Store private Item item; public Store(Item item) this.vật phẩm = item; IoC cùng DI là 2 khái niệm cơ bạn dạng góp mã nguồn của họ trngơi nghỉ cần đọc dễ cùng dễ duy trì hơn. Chính bởi vì vậy Spring framework đã nhập vào sẵn DI trong các số đó.

Spring IoC Container 

IoC container là 1 trong những giữa những khái niệm cần sử dụng phổ biến cho các framework thực hiện Inversion of Control – IoC.

Trong Spring, IoC container được thay mặt đại diện bởi vì ApplicationContext interface. Spring container Chịu đựng trách nhiệm khởi tạo ra, thông số kỹ thuật với gắn ráp những object được nghe biết là những Bean trong Spring, nó cũng làm chủ luôn vòng đời của bọn chúng.

Spring cung ứng một số trong những biện pháp tiến hành ApplicationContext interface nhỏng trải qua ClassPathXmlApplicationContext cùng FileSystemXmlApplicationContext cho những ứng dụng hòa bình với WebApplicationContext cho những vận dụng web.

Để gắn thêm ráp những Bean trong áp dụng, container vẫn áp dụng các metadata được cấu hình sinh hoạt dạng XML hoặc annotation.

Dưới đó là một phương pháp bằng tay thủ công nhằm tạo một Spring container

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Để đặt quý giá cho một Item implementation sinh hoạt bên trên thì bạn cũng có thể chỉ định nó trong metadata. Và kế tiếp container sẽ hiểu thông tin này cùng thực hiện nó để tạo ra một Bean tương ứng với Item interface.

Xem thêm: Tải Game Kim Cương Kẹo Ngọt: Thủ Thuật Giúp Bạn Chiến Thắng, Game Mưa Kẹo Ngọt 3

Dependency Injection vào Spring rất có thể thực hiện thông qua constructor, setter, fields mà bọn họ đã tò mò làm việc những phần sau.

Constructor-Based Dependency Injection

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

vì vậy các bạn thấy Việc khởi sản xuất và làm chủ các dependency bây giờ chưa hẳn vày Class áp dụng chúng cai quản nhưng mà thuộc về container.


Bean annotation được sử dụng trên các method định nghĩa ra một Bean. Nếu họ không chỉ định tên của Bean thì tên khoác định của chính nó là tên hàm.

Mỗi Bean chỉ được mãi sau một object trong container. Spring đang chất vấn trường hợp đã lâu dài một object của một Bean trong container thì nó sẽ không còn khởi chế tác lại, ngược chở lại một object sẽ tiến hành chế tạo ra new cùng phân phối container.


Setter-Based Dependency Injection

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

lấy ví dụ sau thời điểm khởi sản xuất Item Bean chúng ta có thể khởi tạo Store với Item Bean sẽ khởi sản xuất 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 ngôi trường hòa hợp thực hiện Field-Based DI, bọn họ vẫn tiêm các dependency của class thông qua
Autowired private Item item; }Trong Khi khởi chế tạo một object Store, nếu như không tồn tại constructor hoặc setter làm sao nhằm tiêm Item bean vào, container sẽ sử dụng reflection để mang Item vào Store.

Cách tiếp cận này hoàn toàn có thể trông dễ dàng và đơn giản với Gọn gàng rộng tuy nhiên không được khuyến nghị áp dụng vị nó gồm một số nhược điểm như:

Phương thơm pháp này áp dụng reflection để lấy vào các dependency, tốn kém nhẹm hơn so với tiêm dựa trên constructor hoặc setter.

Autowiring Dependencies

Autowire có thể chấp nhận được Spring container tự động giải quyết và xử lý những dependency theo 4 chiến lược sau:

no – Giá trị mặc định, nghĩa là không có lý lẽ nào của Autowire được cung cấp và chúng ta bắt buộc hướng dẫn và chỉ định tên của các dependency một bí quyết ví dụ.byName – Spring container đã tra cứu tìm một bean với thương hiệu trùng cùng với thương hiệu của trực thuộc tính mà lại họ đặt trong class.constructor – Spring container sẽ tìm kiếm kiếm các dependency dựa vào các tmê mẩn số bên trên constructor tất cả cùng dạng hình tài liệu cùng với những ở trong tính khai báo vào class.

ví dụ như autowire item1 bean vào store bean.


Bean(autowire = Autowire.BY_TYPE)public class Store private Item item; public setItem(Item item) this.tác phẩm = item; Chúng ta cũng có thể thao tác làm việc này cùng với
Qualifier("item1") private Item item;}

Lazy Initialized Bean

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

bean id="item1" class="org.baeldung.store.ItemImpl1" lazy-init="true" />bởi thế, itemq bean sẽ không còn được khởi tạo nên cho đến lúc lịch trình đề nghị đến nó. Cách này còn có một điểm tốt là công tác sẽ khởi chạy nhanh hao rộng, nhưng lại các bạn đề nghị đánh thay đổi là những lỗi thông số kỹ thuật sẽ không được phát hiện nay thời điểm khởi chạy nhưng đề xuất hóng cho tới Khi bean được khởi chế tác lần thứ nhất.

Xem thêm: 7 Tựa Game Nhật Bản Pc - Game Nhật Bản : Chơi Thử Samurai Warriors 5

Kết bài

Có vẽ hầu như định nghĩa bên trên hơi nặng trĩu nằn nì, trong cả những người dân new đi làm hoặc có tác dụng trung bình 1-hai năm cũng rất khó khăn để gọi. Nên chúng ta cũng đừng bở tưởng nhé, cđọng gọi để có tư tưởng trước cũng được, đàng hoàng nó ngấm. Bên bên dưới là những tư liệu bản thân tham khảo những bạn có thể vào đó nhằm tò mò kỹ hơn.

Nguồn tsay đắm 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