Dependencies Là Gì

1. Dependency Injection là gì?

Dependency Inject là 1 trong những kỹ thuật, 1 thiết kế pattern chất nhận được xóa quăng quật sự dựa vào hard-code và tạo nên ứng dụng của chúng ta dễ mở rộng và maintain hơn.

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

Bạn sẽ xem: Dependency là gì

Để hiểu khái niệm trên, mình có ví dụ sau:

Mình có một ứng dụng call tới object của class MySQLDAO(class MySQLDAO chuyên triển khai truy vấn với cơ sở dữ liệu MySQL của ứng dụng)

Bây giờ bạn có nhu cầu truy vấn cho tới cơ sở dữ liệu postgre. Chúng ta phải xóa khai báo MySQLDAO trong ứng dụng và thay bởi PostgreDAO, tiếp đến muốn sử dụng lại MySQLDAO chúng ta lại làm ngược lại… rõ ràng code sẽ cần sửa lại cùng test các lần.

Giải pháp dùng if-else kiểm tra điều kiện sẽ dùng đối tượng DAO nào… nhưng sau đấy bao gồm thêm một DAO khác ví dụ như MSSQLDAO chẳng hạn… phức tạp hơn nhiều bắt buộc không.

(Thường thì ít lúc 1 ứng dụng dùng những loại các đại lý dữ liệu khác nhau nhưng sẽ có được trường hợp áp dụng nhiều database, mình nhằm thành nhiều loại cơ sở dữ liệu không giống nhau cho dễ hình dung)

Dependency Injection (DI) là gì? Code ví dụ bởi Java

Dependency Inject đó là để xử lý cho trường hợp như vậy này.

Trong lấy ví dụ trên ta tạo ra 1 interface AbstractDAO và cho các class DAO cơ thừa kế AbstractDAO. Hiện nay trong những class thực hiện DAO ta khai báo AbstractDAO, phụ thuộc vào điều kiện khớp ứng AbstractDAO có thể là MySQLDAO hoặc PostgreDAO.

Việc thay thế sửa chữa AbstractDAO bởi MySQLDAO/PostgreDAO được hotline là injection.


*

Dependency Injection (DI) là gì? Code ví dụ bởi Java

2. Ví dụ.

Mình vẫn code thử nghiệm ví dụ trên:

Tạo một interface để khai báo các method giao tiếp với database:

public interface AbstractDAO void insert(); void delete(); void update();Tạo những class DAO tương ứng với từng loại database với implements các method của AbstractDAO

public class MySQLDAO implements AbstractDAO Override public void insert() System.out.println("MySQL insert"); Override public void delete() System.out.println("MySQL delete"); Override public void update() System.out.println("MySQL update"); public class PostgreDAO implements AbstractDAO Override public void insert() System.out.println("Postgre insert"); Override public void delete() System.out.println("Postgre delete"); Override public void update() System.out.println("Postgre update"); public class MSSQLDAO implements AbstractDAO Override public void insert() System.out.println("MSSQL insert"); Override public void delete() System.out.println("MSSQL delete"); Override public void update() System.out.println("MSSQL update"); file config.properites lưu tin tức config đưa ra quyết định sẽ kết nối tới database nào.

## 1: MySQL | 2: Postgre | 3: MSSQLdatabase=2Bây giờ sinh sống class đề xuất dùng cho dao ta vẫn khai báo AbstractDAO, phụ thuộc vào tham số trong file config nhưng mà ta khởi tạo đối tượng người dùng AbstractDAO là MySQLDAO, PostgreDAO hay MSSQLDAO.

Xem thêm: Tại Sao Người Chết Phải Kiêng Mèo Nhảy Qua, Tại Sao Khi Người Mất Lại Kiêng Mèo Nhảy Qua

public class FactoryDAO public static AbstractDAO getDAO() Properties prop = new Properties(); InputStream input đầu vào = null; try input = new FileInputStream("source/config.properties"); // load a properties file prop.load(input); // get the database value String database = prop.getProperty("database"); if (database.equals("1")) return new MySQLDAO(); if (database.equals("2")) return new PostgreDAO(); if (database.equals("3")) return new MSSQLDAO(); catch (IOException ex) ex.printStackTrace(); return null; return null;

Demo ví dụ trên:

public class MainApp public static void main(String args) Client client = new Client(); client.execute(); Kết quả:

Postgre insertPostgre updatePostgre deleteSửa quý hiếm database trong file config.properties bởi 1 với chạy lại:

MySQL insertMySQL updateMySQL deleteBây giờ nếu như khách hàng có thêm 1 loại database khác cần sử dụng thì chỉ cần tạo DAO đến nó, implements AbstractDAO cùng sửa lại FactoryDAO là được.

Ví dụ mình có thêm database DB2.

mình sẽ tạo class DB2DAO.java implements AbstractDAO.

trong method getDAO() của FactoryDAO thêm đk nếu database = 4 thì vẫn trả về DB2DAO.

rõ ràng cách làm này giúp chúng ta sẽ không ngừng mở rộng ứng dụng hơn không ít và mỗi lần chuyển đổi đối tượng dao ta không nhất thiết phải khởi động/deploy lại vận dụng mà chỉ cần thay đổi thông tin trong tệp tin config.properties.

Việc lấy thông tin từ tệp tin config.properites rồi ra quyết định tạo đối tượng người sử dụng trong class Client.java đó là tiêm sự nhờ vào (Dependency Injection – DI)

Download code lấy ví dụ như trên trên đây

3. Các phương pháp thực hiện Dependency Injection.

Các phương pháp cơ bản để Dependency Injection.

Constructor Injection: các dependency sẽ tiến hành truyền vào (inject vào) 1 class trải qua constructor của class đó. Đây là phương pháp thông dụng nhất. (ví dụ trên mình dùng theo cách này)Setter Injection: những dependency sẽ được truyền vào 1 class thông qua các hàm Setter/Getter

Ví dụ sinh sống trên mình đã sửa method getDao làm việc class Client.java thành

public AbstractDAO getDao() dao = FactoryDAO.getDAO(); return dao;Public fields: những dependency sẽ được truyền vào 1 class một biện pháp trực tiếp vào những public field. Bí quyết này ít được áp dụng nhất. Ví dụ sinh sống trên khi khai báo AbstractDAO ở class Client.java thànhAbstractDAO dao = FactoryDAO.getDAO();Dependency Injection (DI) là gì? Code ví dụ bằng Java

4. Ưu nhược điểm của Dependency Injection

5. Một số trong những khái niệm khác

DI ContainerDI Container là chỉ gần như thành phần tạo nên và thống trị module/object con được Inject, ví dụ nghỉ ngơi trên là FactoryDAO.Hiện tại có khá nhiều Framework và các thư viện cung ứng làm DI như CDI, Spring DI, JSF…Inversion of ControlInversion of Control dịch là hòn đảo ngược điều khiển (hơi cực nhọc hiểu)Ý của chính nó là làm biến đổi luồng tinh chỉnh và điều khiển của ứng dụng. Ví như ở bên trên việc biến đổi thông tin trong tệp tin config.properties vẫn làm chuyển đổi luồng chạy của ứng dụng.Dependency Injection (DI) là gì? Code ví dụ bởi Java

References:

https://en.wikipedia.org/wiki/Dependency_injection

https://stackoverflow.com/questions/130794/what-is-dependency-injection

This entry was posted in design Pattern, FAQ và tagged thiết kế pattern, faq. Bookmark the permalink.

Điều hướng bài bác viết