DI LÀ GÌ

  -  

1. Dependency Injection là gì?

Dependency Inject là một trong kỹ thuật, 1 kiến thiết pattern chất nhận được xóa bỏ sự nhờ vào hard-code và tạo cho ứng dụng của doanh nghiệp dễ không ngừng mở rộng với maintain rộng.

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

Để đọc quan niệm trên, mình bao gồm ví dụ sau:

Mình có 1 vận dụng Call tới object của class MySQLDAO(class MySQLDAO chăm triển khai tróc nã vấn với cơ sở dữ liệu MySQL của ứng dụng)

Bây giờ bạn có nhu cầu tróc nã vấn cho tới các đại lý tài liệu postgre. quý khách yêu cầu xóa khai báo MySQLDAO vào ứng dụng với nạm bởi PostgreDAO, sau đó muốn sử dụng lại MySQLDAO các bạn lại làm ngược lại… cụ thể code vẫn yêu cầu sửa lại với test nhiều lần.

Giải pháp dùng if-else kiểm tra ĐK sẽ sử dụng đối tượng DAO nào… tuy nhiên sau đấy tất cả thêm một DAO khác ví dụ như MSSQLDAO chẳng hạn… phức tạp rộng những cần không.

(Thường thì không nhiều lúc một ứng dụng cần sử dụng các một số loại đại lý tài liệu không giống nhau dẫu vậy sẽ sở hữu ngôi trường đúng theo áp dụng nhiều database, mình nhằm thành nhiều nhiều loại cơ sở dữ liệu khác biệt mang đến dễ dàng hình dung)

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

Dependency Inject chính là để giải quyết cho ngôi trường vừa lòng như thế này.

Trong ví dụ trên ta chế tạo ra 1 interface AbstractDAO với cho những class DAO tê thừa kế AbstractDAO. Bây tiếng trong các class sử dụng DAO ta knhì báo AbstractDAO, tùy thuộc vào điều kiện khớp ứng AbstractDAO có thể là MySQLDAO hoặc PostgreDAO.

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

*

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

2. ví dụ như.

Mình đang code kiểm tra ví dụ trên:

Tạo một interface nhằm knhị 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 những method của AbstractDAO

public class MySQLDAO implements AbstractDAO
Override public void insert() System.out.println("MySquốc lộ insert");
Override public void delete() System.out.println("MySquốc lộ delete");
Override public void update() System.out.println("MySquốc lộ 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("MSSquốc lộ insert");
Override public void delete() System.out.println("MSSquốc lộ delete");
Override public void update() System.out.println("MSSquốc lộ update"); tệp tin config.properites lưu báo cáo config quyết định vẫn kết nối cho tới database làm sao.

## 1: MySquốc lộ | 2: Postgre | 3: MSSQLdatabase=2Bây tiếng sống class phải cần sử dụng mang lại dao ta đang khai báo AbstractDAO, tùy thuộc vào tmê mệt số trong tệp tin config nhưng ta khởi tạo thành đối tượng người sử dụng AbstractDAO là MySQLDAO, PostgreDAO xuất xắc MSSQLDAO.

public class Client AbstractDAO dao; public Client() dao = FactoryDAO.getDAO(); public AbstractDAO getDao() return dao; public void setDao(AbstractDAO dao) this.dao = dao; public void execute() dao.insert(); dao.update(); dao.delete(); Như các bạn thấy ở đây bản thân cần sử dụng Factory Pattern để đưa ra quyết định đối tượng người dùng được tạo thành. Class FactoryDAO (Factory class) đã hiểu tệp tin với quyết định đối tượng như thế nào được tạo thành.

Xem thêm: Gluconolactone Là Gì - Tác Dụng Của Gluconolactone Trong Mỹ Phẩm

public class FactoryDAO public static AbstractDAO getDAO() Properties prop = new Properties(); InputStream input = null; try input đầu vào = 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 giá trị database vào tệp tin config.properties bởi 1 với chạy lại:

MySquốc lộ insertMySquốc lộ updateMySquốc lộ deleteBây giờ nếu như khách hàng gồm thêm một loại database không giống phải sử dụng thì chỉ cần sản xuất DAO cho nó, implements AbstractDAO và sửa lại FactoryDAO là được.

ví dụ như mình bao gồm 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 như database = 4 thì đang trả về DB2DAO.

ví dụ cách làm này đỡ đần ta đã không ngừng mở rộng ứng dụng rộng không hề ít cùng những lần thay đổi đối tượng người tiêu dùng dao ta không cần phải khởi động/deploy lại áp dụng nhưng mà chỉ việc biến hóa công bố trong file config.properties.

Việc rước thông tin từ bỏ file config.properites rồi đưa ra quyết định tạo ra đối tượng người tiêu dùng trong class Client.java chính là tiêm sự dựa vào (Dependency Injection – DI)

Download code ví dụ trên trên đây

3. Các cách thức triển khai Dependency Injection.

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

Constructor Injection: Các dependency sẽ được truyền vào (inject vào) 1 class thông qua constructor của class kia. Đây là bí quyết thường dùng nhất. (ví dụ bên trên bản thân cần sử dụng Theo phong cách này)Setter Injection: Các dependency sẽ được truyền vào 1 class trải qua các hàm Setter/Getter

lấy ví dụ như nghỉ ngơi bên trên bản thân sẽ sửa method getDao sinh hoạt class Client.java thành

public AbstractDAO getDao() dao = FactoryDAO.getDAO(); return dao;Public fields: Các dependency sẽ được truyền vào 1 class một biện pháp trực tiếp vào các public field. Cách này không nhiều được áp dụng tốt nhất. lấy ví dụ ngơi nghỉ bên trên lúc khai báo AbstractDAO sinh sống 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

Ưu điểmGiảm sự dính nối thân các moduleCode dễ gia hạn, dễ dàng thay thế moduleRất dễ dàng test và viết Unit TestDễ dàng thấy tình dục thân những module (Vì những dependecy rất nhiều được inject vào constructor)Nhược điểmKhái niệm DI khá cực nhọc đọc với những người mớiKhó debug vị lần chần implements làm sao của interface được Điện thoại tư vấn đếnCác object được khởi tạo ra từ đầu làm cho giảm performanceLàm tăng cường độ phức tạp của codeDo đó cùng với rất nhiều vận dụng nhỏ dại gọn, làm cho ăn uống luôn luôn thì ko bắt buộc vận dụng DI, còn các ứng dụng bắt buộc sự linch hoạt, mở rộng, maintain thì thực hiện DI.

Xem thêm: Mua Bán Máy Chơi Game Cầm Tay Ps Vita Siêu Rẻ, Thu Tiền Khi Nhận

5. Một số tư tưởng khác

DI ContainerDI Container là chỉ hầu như nguyên tố chế tác cùng thống trị module/object bé được Inject, ví dụ sinh sống trên là FactoryDAO.Hiện tại có tương đối nhiều Framework cùng những tlỗi viện cung cấp làm cho DI nhỏng CDI, Spring DI, JSF…Inversion of ControlInversion of Control dịch là đảo ngược tinh chỉnh và điều khiển (khá cạnh tranh hiểu)Ý của chính nó là làm biến hóa luồng điều khiển và tinh chỉnh của áp dụng. ví dụ như làm việc trên vấn đề chuyển đổi thông tin trong file config.properties đang có tác dụng chuyển đổi luồng chạy của vận 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 and tagged thiết kế pattern, faq. Bookmark the permalinks.

Điều phía bài xích viết