NodeJS Xu hướng lập trình hiện nay. (PHP vs Nodejs)

11:16 HungPV7 Blog 1 Comments

Lịch sử Node.js tóm tắt
Node.js được Ryan Dahl giới thiệu 2009 cho phép lập trình JavaScript phía server. Trước đây JavaScript chỉ được coi là một ngôn ngữ đơn giản tạo hiệu ứng hoạt hình, tương tác phía trình duyệt. Cho đến khi Google Chrome sử dụng V8 engine, một bộ dịch, thực thi mã JavaScript nhanh nhất thế giới tính đến nay. V8 được viết bằng C/C++, mã nguồn mở, cho phép bên thứ 3 toàn quyền sử dụng, triển khai trên hệ điều hành khác nhau: Windows, Linux, Unix, MacOSX. Node.js được xây dựng trên V8 và thư viện LibUV cho phép lệnh thực thi hiện tại không ngăn các lệnh kế tiếp chạy luôn: cơ chế Non-Blocking I/O.

Cơ chế Non Blocking I/O giúp máy chủ tạo ít process (hoặc thread) hơn, ít phải luân chuyển giữa các thread để xử lý các tác vụ. Máy chủ web Nginx cũng là một ví dụ tốt Non Blocking I/O chạy tốc độ vượt trội, tốn ít bộ nhớ so với máy chủ Apache sử dụng thread switching và thread pool để hứng, xử lý các yêu cầu.
Khi tiến hành nhiều phép đo đạc tốc độ trên môi trường máy ảo giống hệt nhau về cấu hình, chúng tôi nhận thấy một thực tế không thể chối cãi, web site viết trên Node.js + Express luôn chạy nhanh hơn 1.5 - 2.5 lần web site PHP + Phalcon cùng cấu trúc, cùng hệ cơ sở dữ liệu, cùng cấu hình máy ảo. Trong nhóm các framework PHP, Phalcon luôn là đứng đầu bảng về tốc độ. Tốc độ xử lý của Phalcon trong vài trường hợp còn nhanh hơn cả HHVM. 
Có một số ý kiến cho rằng: hiện nay chi phí thuê máy chủ ngày càng rẻ. Chỉ với 20$/tháng, đã có thể thuê một máy chủ ảo hóa 2 core 3.4 GHz, 2 GRAM DDR3, 40 G ổ cứng SSD, rẻ hơn so với năm 2012 khoảng 4 lần. Vậy nếu PHP là một ngôn ngữ phổ biến dễ học, có rất nhiều framework tuyệt vời như WordPress, Joomla, Drupal, Magento, có sẵn các theme giao diện tuyệt đẹp chỉ mất khoảng 40 - 120 USD, người dùng có mọi thứ từ một bộ CMS ổn định đến giao diện đồ họa cấu hình là chạy. Tuy nhiên trang web load chậm không phải lúc nào cũng thiếu RAM hay CPU Core. Nếu xử lý không đúng chỗ thì việc bổ xung RAM, hay CPU Core không cải thiện được triệt để.
Thời gian tải trang (page load time) cốt tử cho sự thành bại của doanh nghiệp kinh doanh trên Internet
Thời gian tải trang (page load time) càng nhanh, trải nghiệm người dùng càng tốt, người dùng sẽ xem nhiều trang hơn, xác suất quyết định mua hàng dễ dàng hơn và ngược lại:
  • Hầu hết người duyệt web bỏ cuộc hoặc chuyển qua web site khác nếu phải chờ hơn 6-10 giây
  • Page load time từ 4 giây đã có 25% lượng người duyệt web bỏ đi
  • 1 giây chậm đi khi hiển thị trang, tỷ lệ chuyển đổi thành công từ xem sang đặt hàng (coversion rate) giảm 7%
Tham khảo thêm bài phân tích ở đây SEO 101: How Important is Site Speed in 2014? có thể tóm tắt thêm
  • 51% người mua hàng ở Mỹ phàn nàn web site quá chậm khiến họ không thể đặt hàng.
  • Năm 2010, một trang cần 6 giây để tải thì tỷ lệ chuyển đổi thành công giảm 40%, còn năm 2014, tỷ lệ này giảm sâu hơn còn 50%.
  • 47% người duyệt web muốn trang hiện ra trong vòng dưới 2 giây
  • Khi người dùng sử dụng di động, hành vi chuyển qua lại giữa các ứng dụng, web site càng gấp gáp và ngắn. Người dùng mất tập trung hơn, trang web chậm, giao diện kém thân thiện khiến người dùng nhanh chóng bỏ qua và không bao giờ quay lại lần 2.
PHP ngôn ngữ thống trị thế giới web
  • PHP được Ramus Lerdorf sáng tạo ra năm 1995, cách đây 20 năm. Phiên bản phổ biến hiện nay là 5.6. Bản 6.x gần như sẽ bị bỏ qua mặc dù đã được lên lộ trình và phát triển cách đây vài năm. PHP 7 đã ra mắt tháng 10  2015.
  • Thế mạnh của PHP đó là cộng đồng đông đảo, mã nguồn mở cực kỳ phong phú. Số lượng việc làm cho lập trình viên PHP lớn.
  • PHP dễ học và dễ viết: dev có thể chèn mã PHP cùng với mã HTML. Tư duy lập trình tuần tự, mã HTML của trang web có thể coi là một chuỗi được cộng lại rồi trả về trình duyệt
  • Web site PHP chạy tốt trong môi trường shared hosting. Một web server có thể  chứa nhiều web site con, có tên miền riêng biệt để giảm chi phí.
Điểm yếu của PHP có thể khiến PHP thoái trào hoặc ít nhất cho Node.js cơ hội vượt lên
  • PHP không hỗ trợ non blocking sẵn mà phải sử dụng một số thư viện như React đã rất cũ. Tư duy lập trình tuần tự blocking rất dễ với người mới học, dễ debug, nhưng rất tệ khi xử lý các tác vụ tốn thời gian, buộc các tác vụ kế tiếp phải đợi
  • PHP không hỗ trợ sẵn web socket mà phải sử dụng thư viện ngoài như Rachet không đảm bảo chạy trên tất cả các hệ điều hành. Việc không hỗ trợ lập trình Web Socket, real time notification, chat, khiến cho web site PHP buộc phải sử dụng công nghệ ngoài để hỗ trợ, và thường là Node.js, Socket.io hoặc mua dịch vụ ngoài như Zopim Chat
  • Callback được giới thiệu trong PHP 5.4 . Nhưng hầu hết lập trình PHP vẫn viết web site theo phương pháp cổ điển, tuần tự từ trên xuống dưới.
  • Rất nhiều lập trình phàn nàn về tốc độ thực thi của PHP. FaceBook sáng tạo ra HHVM để biên dịch mã PHP ra bytecode tương tự như Java - Java Virtual Machine. Phalcon viết thư viện framework bằng C biên dịch ra extension. Những cố gắng này rõ ràng được đền đáp trong một số trường hợp, nhưng nó không giải quyết hết gốc rễ của lập trình blocking. Trong công ty, có một nhân viên rất giỏi, xử lý công việc rất nhanh, ai cũng phải hỏi ý kiến anh ta, việc nào cũng đến tay anh ta, một ngày kia, nhân viên giỏi này bị ốm, hoặc có quá nhiều việc dồn dập đến, mọi nhân viên khác đều phải chờ đợi.
So sánh tốc độ PHP web site vs Node.js web site 
Hiện giờ chưa có nhiều benchmark nghiêm túc, công bằng để so sánh PHP vs JavaScript - Node.js. Vì trải nghiệm người dùng về tốc độ hiển thị trang web là quan trọng nhất, việc so sánh khập khiễng gây tranh cãi mất thời gian. Tôi cố gắng sử dụng các công nghệ hỗ trợ giống hết nhau, trên máy chủ giống hệt về cấu hình, tạo ra một lượng dữ liệu đủ lớn 50,000 bản ghi, một web site đủ độ phức tạp gồm khác với những các benchmark trước đây khá cẩu thả chỉ trả về một chuỗi Hello World đơn giản rồi dùng Apache Benchmark. Web site 2 đội cùng viết là gồm 100 category, mỗi category có 500 mặt hàng, có phân trang, có ảnh riêng cho từng mặt hàng.... Với Node.js site.

HungPV

1 nhận xét:

Một số module quan trọng khi làm việc với nodejs

20:06 HungPV7 Blog 0 Comments



Bài viết này mình sẽ tổng hợp lại những module hữu ích mà thường sử dụng trong lập trình nodejs.

Debug

Trong Node.js. "console.log" cho phép bạn in hầu hết mọi thứ ra console. Truyền vào một đối tượng thì nó sẽ in ra đúng như một đối tượng Javascript bình thường. Nó chấp nhận mọi tham số tùy ý và in ra tất cả một cách gọn gàng. Có nhiều lý do vì sao một lập trình viên cảm thấy thích dùng console.log để gỡ lỗi, tuy nhiên bạn không nên sử dụng "console.log" trong code thực tế. Bạn nên tránh viết "console.log" trong toàn bộ code của mình rồi chuyển nó thành chú thích sau khi không cần gỡ lỗi. Thay vào đó, dùng một thư viên rất hay được xây dựng để làm đúng việc này, ví dụ như debug.
Những gói thư viện này cung cấp một cách thuật tiện để bật tắt các dòng lệnh debug khi bắt đầu ứng dụng. Ví dụ, với debug, nó cho phép ngăn bất kì dòng debug nào in ra terminal bằng cách không thiết lập giá trị môi trường DEBUG.

ExpressJS

Có lẽ đây là module NodeJS được biết đến và sử dụng nhiều nhất trong cộng đồng NodeJS developer. ExpressJS là một web framework nhỏ gọn nhưng rất mạnh mẽ. Nó còn được sử dụng làm nền tảng để xây dựng những framework khác như SailsJS. Nếu bạn mới tìm hiểu và muốn xây dựng một website bằng NodeJS thì đây là module bạn nên lựa chọn.

Mongoose

MongoDB là NoSQL database phổ biến nhất và thường được sử dụng trong các dự án website NodeJS.
Để tương tác với MongoDB một cách dễ dàng hơn, Mongoose đã ra đời. Đây là một ODM Library cho MongoDB hay hiểu nôm na là một thư viện với các hàm giúp bạn giao tiếp, xử lý với MongoDB nhanh gọn hơn.
Bạn lựa chọn MongoDB cho dự án của mình thì Mongoose sẽ là một module cực kỳ hữu ích.

Request

Request giúp bạn dễ dàng tạo ra các HTTP request trong ứng dụng NodeJS của mình. Module này support tất cả các loại request: GET, POST, PUT, DELETE. Đây là một lựa chọn tốt để gọi các REST APIs.

Async

Nếu bạn mới làm quen với NodeJS và Javascript, chắc chắn bạn sẽ phải mất thời gian vật lộn với mô hình lập trình bất đồng bộ của Javascript.
Thử hình dung, bạn có một Array với mỗi phần tử cần được xử lý bằng một hàm bất đồng bộ và kết quả bạn muốn nhận được là một Array các phần tử đã được xử lý.
Lúc chưa biết đến module Async, mình từng phải viết đệ quy để giải quyết vấn đề này ~.~ Nhưng giờ thì mọi chuyện đã đơn giản hơn rất nhiều.
Bạn hãy xem đoạn code dưới đây:
async.map(['file1','file2'], fs.stat, function(err, results){  
    // results is now an array of stats for each file
});
async.filter(['file1','file2'], fs.exists, function(results){  
    // results now equals an array of the existing files
});
async.parallel([  
    function(){ ... },
    function(){ ... }
], callback);
async.series([  
    function(){ ... },
    function(){ ... }
]);

PM2

Đây là một công cụ hỗ trợ bạn deploy ứng dụng NodeJS lên server. So với một module có chức năng tương tự là forever, PM2 mạnh mẽ hơn rất nhiều với những chức năng cực kỳ hữu ích.
Nếu bạn chuẩn bị deploy một ứng dụng NodeJS thì đây là module bạn nên tìm hiểu và sử dụng.

EJS

EJS là một template engine tốt thường được sử dụng kèm theo ExpressJS. EJS dễ sử dụng vì sử dụng mã HTML thuần tuý, và các mã nhúng cũng rất dễ hiểu.

Grunt / Gulp

Bạn chỉ cần sử dụng một trong hai module này là có thể giải quyết được biết bao nhiêu "công việc tay chân". Quy trình build sản phẩm, debug, deploy của bạn sẽ được rút gọn một cách đáng kể.
Nếu bạn chuẩn bị bắt đầu một project, hãy dành chút thời gian để tìm hiểu về Grunt hoặc Gulp nhé.

0 nhận xét:

SOLID LÀ GÌ – ÁP DỤNG CÁC NGUYÊN LÝ SOLID ĐỂ TRỞ THÀNH MỘT LẬP TRÌNH VIÊN PRO

08:00 HungPV7 Blog 0 Comments

Sau thời gian luyện công các dự án “To”, “Nhỏ” và nghiên cứu về kiến trúc những dự án to nhỏ. Đọc các tài liệu master về System Architecture Design thấy khá hay và được các nhà phát triển framework sử dụng nhiều  nên muốn share cho mọi người và lưu lại.
Tản mạn chút nhé:
Trong quá trình học, hầu như các bạn sinh viên đều được học một số khái niệm OOP cơ bản như sau:
  • Abstraction (Tính trừu tượng)
  • Encapsulation (Tính bao đóng)
  • Inheritance (Tính kế thừa)
  • Polymophirsm (Tính đa hình)
Những khái niệm này đã được dạy khá rõ ràng, và hầu như những buổi phỏng vấn nào cũng có những câu hỏi liên quan đến khái niệm này. Vì 4 khái niệm này khá cơ bản, bạn nào chưa vũng có thể google để tìm hiểu thêm.
Những nguyên lý mình giới thiệu hôm nay là những nguyên lý thiết kế trong OOP. Đây là những nguyên lý được đúc kết bởi máu xương vô số developer, rút ra từ hàng ngàn dự án thành công và thất bại. Một project áp dụng những nguyên lý này sẽ có code dễ đọc, dễ test, rõ ràng hơn. Và việc quan trọng nhất là việc maintainace code sẽ dễ hơn rất nhiều (Ai có kinh nghiệm trong ngành IT đều biết thời gian code chỉ chiếm 20-40%, còn lại là thời gian để maintainance: thêm bớt chức năng và sửa lỗi).  Nắm vững những nguyên lý này, đồng thời áp dụng chúng trong việc thiết kế + viết code sẽ giúp bạn tiến thêm 1 bước trên con đường thành senior nhé.
Tập trung vào vấn đề chính nhé.
Sau đây mình sẽ giới thiệu về 5 nguyên tắc về kiến trúc project khi làm việc với 1 project vừa và lớn. Được viết tăt (SOLID) (cụm từ viết tắt nhìn quen quen nhở 🙂 )
  1. Single responsibility principle
  2. Open/closed principle
  3. Liskov substitution principle
  4. Interface segregation principle
  5. Dependency inversion principle
Dưới đây mình sẽ giới thiệu tổng quan bằng lời về các kiến trúc này, Nếu bài viết được phản hồi tích cức thì mình sẽ làm sample cụ thể bằng code cho mọi người dễ hiểu hơn.

1. Single responsibility principle

image_thumb_698ffa0c
Nguyên lý đầu tiên, tương ứng với chữ S trong SOLID. Nội dung nguyên lý:
Một class chỉ nên giữ 1 trách nhiệm duy nhất 
(Chỉ có thể sửa đổi class với 1 lý do duy nhất)
Để hiểu nguyên lý này, ta hãy lấy ví dụ với 1 class vi phạm nguyên lý. Ta có 1 class như sau
public class ReportManager()
{
 public void ReadDataFromDB();
 public void ProcessData();
 public void PrintReport();
}
Class này giữ tới 3 trách nhiệm: Đọc dữ liệu từ DB, xử lý dữ liệu, in kết quả. Do đó, chỉ cần ta thay đổi DB, thay đổi cách xuất kết quả, … ta sẽ phải sửa đổi class này. Càng về sau class sẽ càng phình to ra. Theo đúng nguyên lý, ta phải tách class này ra làm 3 class riêng. Tuy số lượng class nhiều hơn những việc sửa chữa sẽ đơn giản hơn, class ngắn hơn nên cũng ít bug hơn.
2. Open/closed principle
Nguyên lý thứ hai, tương ứng với chữ O trong SOLID. Nội dung nguyên lý:
openclosed_principle_thumb
Có thể thoải mái mở rộng 1 class, nhưng không được sửa đổi bên trong class đó 
(open for extension but closed for modification).
Theo nguyên lý này, mỗi khi ta muốn thêm chức năng,.. cho chương trình, chúng ta nên viết class mới mở rộng class cũ ( bằng cách kế thừa hoặc sở hữu class cũ) không nên sửa đổi class cũ.

3. Liskov Substitution Principle

liskov_substitution_principle_thumb.jpg
Nguyên lý thứ ba, tương ứng với chữ L trong SOLID. Nội dung nguyên lý:
Trong một chương trình, các object của class con có thể thay thế class cha mà không làm thay đổi tính đúng đắn của chương trình
Hơi khó hiểu? Không sao, lúc mới đọc mình cũng vậy. Hãy tưởng tượng bạn có 1 class cha tên Vịt. Các class VịtBầu, VịtXiêm có thể kế thừa class này, chương trình chạy bình thường. Tuy nhiên nếu ta viết class VịtChạyPin, cần pin mới chạy được. Khi class này kế thừa class Vịt, vì không có pin không chạy được, sẽ gây lỗi. Đó là 1 trường hợp vi phạm nguyên lý này.

4. Interface Segregation Principle

interface_segregation_principle_thumb.jpg
Nguyên lý thứ tư, tương ứng với chữ I trong SOLID. Nội dung nguyên lý:
Thay vì dùng 1 interface lớn, ta nên tách thành nhiều interface nhỏ, với nhiều mục đích cụ thể
Nguyên lý này khá dễ hiểu. Hãy tưởng tượng chúng ta có 1 interface lớn, khoảng 100 methods. Việc implements sẽ khá cực khổ, ngoài ra còn có thể dư thừa vì 1 class không cần dùng hết 100 method. Khi tách interface ra thành nhiều interface nhỏ, gồm các method liên quan tới nhau, việc implement và quản lý sẽ dễ hơn.

5. Dependency inversion principle

dependency_inversion_principle_thumb.jpg
Nguyên lý cuối cùng, tương ứng với chữ D trong SOLID. Nội dung nguyên lý:
1. Các module cấp cao không nên phụ thuộc vào các modules cấp thấp. 
   Cả 2 nên phụ thuộc vào abstraction.
2. Interface (abstraction) không nên phụ thuộc vào chi tiết, mà ngược lại.
( Các class giao tiếp với nhau thông qua interface, 
không phải thông qua implementation.)
Nguyên lý này khá lắt léo, mình sẽ lấy ví dụ thực tế. Chúng ta đều biết 2 loại đèn: đèn tròn và đèn huỳnh quang. Chúng cùng có đuôi tròn, do đó ta có thể thay thế đèn tròn bằng đèn huỳnh quanh cho nhau 1 cách dễ dàng.
20817695_images1672955_bong.jpg
Ở đây, interface chính là đuôi tròn, implementation là bóng đèn tròn và bóng đèn huỳnh quang. Ta có thể swap dễ dàng giữa 2 loại bóng vì ổ điện chỉ quan tâm tới interface (đuôi tròn), không quan tâm tới implementation.
Trong code cũng vậy, khi áp dụng Dependency Inverse, ta chỉ cần quan tâm tới interface. Để kết nối tới database, ta chỉ cần gọi hàm Get, Save … của Interface IDataAccess. Khi thay database, ta chỉ cần thay implementation của interface này.
P/S: Bài viết đi góp nhặt nên hơi lủng củng, mọi người thông cảm nhé.
Thanks
HungPV

0 nhận xét:

Tổng hợp những câu hỏi cơ bản về Spring Framework

07:22 HungPV7 Blog 0 Comments

Spring overview

1.Spring là gì?

Spring là một open source framework dành cho Java Enterprise. Core feature của Spring có thể dùng để xây dựng bất cứ Java application nào, các extensions của Spring có thể được sử dụng cho việc xây dựng web application trên nền tảng Java EE. Spring framework cũng hướng tới mục tiêu làm cho việc phát triển các ứng dụng trên nền tảng Java EE dễ dàng hơn và thúc đẩy việc lập trình tốt hơn bằng model POJO-based.

2.Lợi ích mà Spring framework mang lại

Spring framwork mang lại cho chúng ta sự gọn nhẹ (lightweight), sử dụng Inversion of control (IoC) để giúp loose coupling, sử dụng Aspect oriented programming để tách biệt các thành phần business, có container nới quản lý tất cả life cycle và config của các object trong application, phát triển ứng dụng đơn giản với MVC, có transaction management, cung cấp các API tiện lợi cho việc handling exception.

3.Các module của Spring framework

Những module căn bản của Spring gồm có: Core module, Bean module, Context module, Expression Language module, JDBC module, ORM module , OXM module, Java Messaging Service (JMS) module, Transaction module, Web module, Web-Servlet module, Web-Struts module, Web-Portlet module.

4.Core container

Đây là module cơ bản của Spring, cái mà sẽ cung cấp nhưng tính năng cơ bản của Spring framework. BeanFactory chính là trái tim của bất cứ Spring-based application nào, Spring framework được xây dụng trên module này và nó cũng chính là Spring container.

5.BeanFactory

BeanFactory là implementation của factory pattern dùng để apply inversion of control để tách biệt config và dependencies. Thông thường BeanFactory sẽ được implement bằng XmlBeanFactory.

6.XmlBeanFactory

org.springframework.beans.factory.xml.XmlBeanFactory sẽ load file XML chưa định nghĩa các beans. Container này sẽ đọc config từ XML file và sử dụng nó để khởi tạo application.

7.AOP module

AOP module sử dụng để phát triển application theo hướng khía cạnh. Phần lớn được cung cấp bởi AOP Alliance để chắc chắn đảm bảo khả năng tương tác giữa Spring và các AOP framwork khác.

8.JDBC abstraction và DAO module

Với JDBC abstraction và DAO module, chúng ta có thể chắc chắn về việc giữ cho code thao tác với database luôn đơn giản và sạch sẽ, giảm thiểu thao tác manual để maintain connection hay transaction nhằm cũng tránh được các trường hợp fail do close database resources…, ngoài ra nó còn đưa ra một tầng exeption có nghĩa hơn.

9.Object relational mapping (ORM) module

Spring hỗ trợ việc sử dụng ORM thông qua JDBC, ngoài ra cũng support các ORM framework như Hibernate, JPA…

10.Web module

Spring web module được xây dựng dựa trên application context module, cung cấp web-based context. Module này hỗ trợ web-oriented như handling multipart request, binding request parameter với business object…

11.Spring MVC module

Spring MVC module được sinh ra để hỗ trợ xây dựng MVC web application tốt hơn, mặc dù Spring vẫn có thể integrate được với những MVC framework khác. Spring MVC sử dụng IoC để tách biệt logic ra khỏi controller, vào trong business object. Với Spring MVC ta có thể khai báo để bind request parameter với business object một cách dễ dàng.

12.Spring configuration file

Spring configuration file là một file XML. File này sẽ chứa các class information và mô tả làm sao chúng được cài đặt và giao tiếp với những class khác.

13.Spring IoC container

Spring IoC chịu trách nhiệm cho việc tạo ra các object, quản lý chúng với các dependency (dependency injection (DI)), wiring chúng lại với nhau, cài đặt chúng, cũng như quản lý lifecycle của chúng.

14.Lợi ích của IoC

IoC hay dependency injection tối thiểu hóa lương code trong application. Nó giúp cho application dễ test hơn, bởi vì singleton hay JNDI lookup không thể sử dụng trong Unit test. IoC container cũng hỗ trợ eager instantiation và lazy loading.

15.Implement Application context phổ biến

FileSystemXmlApplicationContext, chúng ta phải truyền đường dẫn đầy đủ của file XML vào constructor.
ClassPathXmlApplicationContext, container sẽ tìm file XML từ trong CLASSPATH.
WebXmlApplicationContext, container sẽ tìm file XML từ web application.

16.Điểm khác nhau giữa BeanFactory và Application context

Application context cung cấp phương tiện để giải quyết các text message bằng cách implement MessageSource, ngoài ra nó cũng đưa ra cách thức generic để load file resource (ví dụ như file hình ảnh).

17.Cấu trúc của Spring application

Interface khai báo tất cả các function. Implementation bao gồm các thuộc tính, getter, setter, function… Spring AOP. Spring configuration XML file. Và chương trình sử dụng tất cả các thứ trên

Dependency Injection

18.Dependency Injection trong Spring

Dependency injection là một concept chung, có thể mô tả bằng nhiều cách. Concept này nói rằng bạn sẽ không tạo ra object nhưng bạn sẽ phải mô tả làm sao để chúng được tạo ra. Và bạn cũng không gọi kết nối trực tiếp các component cũng như service với nhau trong code nhưng bạn phải mô tả component nào thì cần service nào trong file config. Sau khi khai báo tất cả thì container cụ thể là IoC container sẽ làm nhiệm vụ hook tất cả lại với nhau. Cụ thể hơn về concept các bạn có thể xem bài AngularJS cho người mới: Dependencies và Services hoặc Dependency Injection và Inversion of Control.

19.Những kiểu khác nhau của IoC

  • Constructor-based dependency injection: Constructor-based DI được thực hiện khi container invoke một class constructor với một số tham số, mỗi tham số sẽ đại diện cho một dependency đến một class khác.
  • Setter-based dependency injection: Setter-based DI được thực hiện bởi container bằng cách gọi setter method từ bean sau khi invoke no-argument constructor hay no-argument  static factory để khởi tạo bean.

20.Nên sử dụng Constructor-based hay setter-based DI

Có thể sử dụng cả hai. Best practice là sử dụng constructor argument những dependency bắt buộc, và setter cho optional dependency.

0 nhận xét: