Spring Framework

**Spring Framework** là một framework ứng dụng và bộ chứa đảo ngược điều khiển cho nền tảng Java. Chức năng tính của framework này có thể áp dụng cho bất kỳ ứng dụng Java nào, tuy vậy, nhiều bản mở rộng dành cho việc xây dựng ứng dụng nền web cũng được phát triển trên nền tảng Java EE. Tuy framework không ấn định lên một mô hình lập trình cụ thể nào, Spring Framework đã trở nên phổ biến trong cộng đồng Java như một phương án song hành, thay thế, hoặc thậm chí bổ sung cho mô hình Enterprise JavaBeans (EJB). Đây là framework mã nguồn mở.

## Lịch sử
Phần đầu tiên của Spring Framework ban đầu nguyên được Rod Johnson viết vào năm 2000, trong khi ông đang làm một chuyên viên cố vấn cho các khách hàng trong thị trường kinh tế tài chính tại Luân Đôn. Trong lúc đang viết quyển *Expert One-on-one J2EE Design And Development (Programmer to programmer)* (Thiết kế và kiến tạo Java EE - tương giao cá nhân một đối một chuyên ngành (lập trình viên với lập trình viên)), ông đã mở rộng thêm phần mã nguồn, hòng biểu đạt ý tưởng của mình về mối tương quan của các trình ứng dụng với những phần khác nhau của J2EE và cho rằng người ta có thể đơn giản hóa mối tương quan của chúng, và mối liên hệ ấy có thể trở nên cố định, bất biến hơn là những gì mà các lập trình viên và các công ty vốn quen sử dụng tại thời điểm đó.

Trước đây, vào năm 2001, những mô hình lập trình cho các trình ứng dụng cho mạng WEB được đại đa số sử dụng đều do Java Servlet API và Enterprise JavaBean cung cấp. Cả hai đều là đặc tả do Sun Microsystems kiến tạo với sự cộng tác của các nhà buôn bán phần mềm và các bên quan tâm, và chúng rất được mến chuộng trong cộng đồng Java. Những trình ứng dụng không dùng cho mạng WEB như các ứng dụng trình khách (*client-based application*) hay các ứng dụng tác vụ (*batch application*) đều có thể sử dụng các công cụ từ mã nguồn mở, các công cụ trên thị trường hoặc từ các dự án khác là những cái cung cấp những đặc trưng yêu cầu.

Rod Johnson được ghi công là người thiết lập framework, dựa trên những thói quen hành nghề được công chúng chấp nhận là những phương pháp tốt nhất, và tạo cơ hội cho chúng có thể được sử dụng trong tất cả các loại hình chương trình ứng dụng, không chỉ cho các trình ứng dụng cho mạng WEB riêng mà thôi. Ý tưởng này còn được biểu lộ trong cuốn sách của ông và, sau khi được độc giả yêu cầu, ông còn cho xuất bản kèm với mã nguồn với giấy phép mã nguồn mở nữa.

Một nhóm nhỏ các nhà phát triển đang tiếp tục mở rộng framework này và một dự án đã được thành lập tại Sourceforge vào tháng 2 năm 2003. Sau khi phát triển trền nền tảng ban đầu hơn một năm họ đã phát hành phiên bản đầu tiên (1.0) vào tháng 3 năm 2004. Sau khi phát hành nó đã nhận được nhiều sự quan tâm của cộng đồng Java.

Tuy nhiên, Spring Framework cũng chịu nhiều chỉ trích nặng nề năm 2004 và vẫn còn là chủ điểm của những cuộc tranh cãi đôi khi nóng bỏng. Vào thời điểm ra đời phiên bản đầu tiên nhiều lập trình viên cùng một số thành viên tiên phong thấy nhận thấy rằng Spring Framework là một phương hướng mới để thoát khỏi mô hình lập trình truyền thống. Điều này đặc biệt đúng đối với Enterprise JavaBean. Một trong những mục tiêu thiết kế Spring Framework là làm cho nó dễ dàng tích hợp với tiêu chuấn J2EE và các bộ công cụ có sẵn trên thị trường hiện nay. Ảnh hưởng của điều này là nó hầu như góp phần xóa bỏ nhu cầu phải định nghĩa các chức năng đặc trưng trên một bản tài liệu đặc tả chính thức do hội đồng quản lý, cái mà một số người đã từng phê phán.

Spring Framework đã làm cho những kỹ thuật vốn không được biết đến mấy trở nên những kỹ thuật được mọi người ưa chuộng trong một thời gian ngắn ngủi. Một trong những kỹ thuật nổi tiếng hơn cả là kỹ thuật đảo ngược quyền điều khiển (*Inversion of Control*, IoC). Nội trong 2004, Spring Framework được rất nhiều người hưởng ứng và làm theo và cũng do tự chính nó cống hiến khung hình lập trình hướng khía cạnh (*aspect-oriented programming*) (AOP). Spring Framework đã tạo cơ hội cho mẫu hình lập trình này trở nên được ưa thích trong cộng đồng Java.

Năm 2005 cho thấy mức độ hưởng ứng nâng cao hơn những năm trước, nguyên do cũng vì những xuất bản mới được ra với những cột mốc đáng kể và những tính năng mới được thêm vào. Diễn đàn Spring  (*Spring Forum*) ra đời cuối năm 2004 cũng góp phần không nhỏ trong việc nâng cao tính phổ biến của framework hình, và từ đó đến nay đã sinh trưởng trở thành một nguồn thông tin quan trọng, giúp đỡ cho người sử dụng.

Trong cùng năm đó, những người phát triển Spring Framework khởi thủy công ty riêng của họ để hỗ trợ về mặt thương mại và đáng kể hơn cả là sự bắt tay cộng tác với BEA http://www.springframework.org/node/113 . Vào tháng 12 năm 2005, hội thảo đầu tiên về Spring Framework đã được tổ chức tại Miami, Florida thu hút 300 nhà phát triển trong 3 ngày, và tiếp theo đó cuộc hội thảo ở Antwerp vào tháng 6 năm 2006, thu hút hơn 400 người.

## Lịch sử phiên bản
Phiên bản đầu tiên của Spring được viết bởi Rod Johnson, cùng lúc đó ông cũng cho ra cuốn sách *Expert One-on-One J2EE Design and Development* vào tháng 10 năm 2002. Ban đầu, framework được phát hành dưới Giấy phép Apache 2.0 vào tháng 06 2003. Cột mốc đầu tiên, bản 1.0, được phát hành tháng 03 năm 2004, và lần lượt các mốc phát hành kế tiếp vào tháng 09 năm 2004 và tháng 03 năm 2005. Phiên bản Spring 1.2.6 nhận Giải năng suất Jolt (Jolt Productivity award) và một Giải Cải tiến JAX (JAX Innovation Award) vào năm 2006. Spring 2.0 was released in October 2006, Spring 2.5 in November 2007, Spring 3.0 in December 2009, Spring 3.1 in December 2011, and Spring 3.2.5 in November 2013. Spring Framework 4.0 được phát hành vào tháng 12 năm 2013. Cải tiến đáng chú ý của phiên bản này gồm có hỗ trợ Java SE 8, Groovy 2, một số phần của Java EE7, và WebSocket.

Spring Framework 4.2.0 được phát hành ngày 31 tháng 07 năm 2015 và ngay sau đó được nâng cấp lên phiên bản 4.2.1, được phát hành ngày 01 tháng 09 cùng năm. Phiên bản này được mô tả là *"tương thích với Java 6, 7 và 8, chú trọng vào những cải tiến cốt lõi và tính năng web hiện đại"*.

Spring Framework 4.3 được phát hành ngày 10 tháng 06 năm 2016. Phiên bản 4.3.0.RC1  có hiệu lực. Nó *"sẽ là thế hệ cuối cùng cho những yêu cầu của Spring 4 (Java 6+, Servlet 2.5+), chuẩn bị cho phiên bản mở rộng 4.3.x với thời gian hỗ trợ đến năm 2019"*.

Spring 5 được thông báo rằng sẽ dựng trên Reactive Streams tương thích với Reactor Core.

## Tính năng chủ yếu
* Bao gồm bộ quản lý cài đặt rất có hiệu lực dựa trên JavaBeans, áp dụng lý thuyết đảo ngược quyền điều khiển (IoC) làm cho việc mắc nối các chương trình ứng dụng trở nên nhanh chóng và dễ dàng hơn. Việc sử dụng (IoC) trong khung hình Spring Framework còn được ám chỉ đến với cái tên Dependency Injection (DI) (*Nghĩa đen: bơm hay tiếp thành phần phụ thuộc, từ bên ngoài vào, lúc cần thiết, thay vì phải tự tạo từ bên trong*). Nguyên lý của IoC sử dụng trong Spring Framework là một kỹ thuật nhằm ngoại biên hóa (*externalize*) việc kiến tạo và quản lý những thành phần phụ thuộc. Lấy ví dụ trường hợp lớp "Foo" phụ thuộc vào một trường hợp cá biệt của lớp "Bar" để thi hình một nhiệm vụ nào đấy. Theo phương pháp cổ truyền, "Foo" phải tự kiến tạo trường hợp cá biệt của lớp "Bar", dùng hành động "new", hoặc phải tiếp nhận trường hợp cá biệt của lớp này từ một lớp chế xuất nào đấy (*factory class*). Nếu sử dụng tiếp cận của IoC thì một tiến trình ngoại biên sẽ phải cung cấp trường hợp của "Bar" (hoặc một tiểu lớp của nó) cho "Foo" trong thời gian chạy (runtime). Đây chính là nguyên nhân tại sao "DI" là một thành ngữ diễn tả tính năng của Spring Framework rõ hơn "IoC".
* Bao gồm một mẫu hình chế xuất trừu tượng (*abstract factory pattern*) Enterprise Java Beans (EJB) nòng cốt, có thể sử dụng trong bất cứ môi trường nào, từ những khung chứa (*containers*) applet cho đến Java EE.
* Một lớp trừu tượng chung quản lý giao dịch cơ sở dữ liệu (*database transaction*), cho phép các bộ phận quản lý giao dịch được bổ trợ theo lối lắp ráp (pluggable), và tạo điều kiện thuận lợi cho việc phân định danh giới các giao dịch (*demarcate transactions*) mà không cần phải xử lý với những vấn đề ở tầng dưới (*low-level issues*).
* Bao gồm một số các chiến lược phổ thông đã được cài sẵn bên trong (*Built-in generic strategies*) dành cho JTA và một đơn thể nguồn dữ liệu JDBC (*DataSource*). Đối lập với những giao dịch do khung chứa quản lý (*Container-Managed Transactions* - CMT) đơn thuần trong JTA hoặc EJB, hỗ trợ giao dịch trong framework Spring không đòi hỏi môi trường Java EE.
* Tầng liên nối với cơ sở dữ liệu (*JDBC abstraction layer *) cung cấp một cơ chế tầng cấp đầy ý nghĩa đối với những ngoại lệ (*exception hierarchy*) (không còn phải dựa vào việc nắn bóp mã nguồn của nhà sản xuất phần mềm như đối với SQLException nữa), đơn giản hóa việc xử lý lỗi, và cũng đồng thời thuyên giảm số lượng dòng lệnh mà lập trình viên cần phải viết. Lập trình viên sẽ không bao giờ phải viết khối 'finally' trong các dòng mã sử dụng JDBC nữa.
* Tích hợp với Hibernate, JDO và iBATIS SQL Maps: trên phương diện cầm dữ tài nguyên (*resource holders*), hỗ trợ phần thực thi DAO (*Data Access Object - Đối tượng truy cập dữ liệu*), và các chiến lược giao dịch (*transaction strategies*). Đứng hàng đầu trong việc hỗ trợ Hibernate với rất nhiều tính năng IoC tiện dụng, giải quyết nhiều nan đề trong việc tích hợp với Hibernate. Tất cả những tính năng này đều phục tùng cơ chế tầng cấp giao dịch chung cùng tầng cấp ngoại lệ DAO của Spring.
* Khung hình mô hình-giao diện-điều khiển (*Model-view-controller, hay MVC*) linh hoạt dành cho ứng dụng mạng (*web application*), được gây dựng trên tính năng nền tảng của Spring. Các nhà xây dựng phần mềm (*lập trình viên*) có quyền khống chế cao độ trong khung hình này thông qua những giao diện chiến lược (*strategy interfaces*), đồng thời điều tiết với những kỹ thuật đa giao diện (*multiple view technologies*) như JSP, FreeMarker, Velocity, Tiles, iText, và POI. Nên nhớ là Tầng trung gian của Spring có thể dễ dàng kết hợp với một tầng mạng sử dụng bất cứ một khung hình MVC mạng nào đó (*web MVC framework*), như Struts, WebWork, hoặc Tapestry.
* Khung hình lập trình định dạng (*Aspect-oriented programming* - hay AOP) nhằm cung cấp các dịch vụ như dịch cụ quản lý giao dịch (*transaction management*). AOP cung cấp khả năng thực thi lôgic đan kết (*crosscutting logic*) - tức những lôgic tác động đến rất nhiều phần của chương trình ứng dụng - tại cùng một chỗ (nhóm lại) và để cho lôgic ấy áp dụng xuyên suốt chương trình ứng dụng của mình một cách tự động.

Vì những khó khăn trong việc kiến lập một cấu trúc mạch lạc để thiết kế phần mô hình (*Model part*) trong chương trình ứng dụng, khi áp dụng mô hình MVC (*design pattern*) (ví như Struts), khả năng Spring tạo điều kiện cho người sử dụng làm việc một cách dễ dàng có nghĩa là các nhà xây dựng có thể nhanh chóng điều chỉnh lại những tiếp cận không thành quả của mình để lợi dụng tầng lớp JDBC trừu tượng của Spring Framework.

## Giới thiệu
Spring Framework cung cấp các giải pháp cho nhiều thách thức kỹ thuật mà các nhà phát triển phần mềm Java và các tổ chức muốn tạo ứng dụng dựa trên nền tảng Java phải đối mặt với Java platform. Bởi vì số lượng lớn chức năng của Spring Framework, việc phân loại những bộ phận cơ bản kiến tạo nên framework là một việc rất khó. Spring Framework không chỉ được liên kết riêng biệt với Java Enterprise platform mặc dù sự tích hợp sâu của Spring trong Java EE là một yếu tố quan trọng cho sự phổ dụng, nổi tiếng của nó.

Có lẽ Spring Framework nổi tiếng nhất với sự cung cấp một cách hiệu quả các tính năng cần thiết để tạo ra các ứng dụng thương mại phức tạp, vượt lên khỏi các mô hình lập trình từng chiếm vị trí ưu thế trong lịch sử ngành công nghiệp phần mềm. Tiếp theo, nó cũng được ghi nhận về việc đưa các chức năng vốn ít được quen biết vào thực tế, có khi còn vượt cả ra bên ngoài nền tảng Java nữa.

Thành quả của việc này là nó đã tạo nên một framework, cung cấp một mô hình nhất quán và làm cho nó có thể áp dụng vào hầu hết các loại ứng dụng được tạo trên nền tảng Java ngày nay. framework Spring được coi như thực thi một cách làm việc dựa trên những thói quen thực hành tốt nhất và những tiêu chuẩn công nghiệp, và đồng thời tạo cơ hội cho những lĩnh vực trong Java sử dụng nó.

### Các môđun
Spring Framework được coi như là một tổ hợp của nhiều khung hình nhỏ, hay nói cách khác, nó là tổ hợp của khung hình trong khung hình. Đại bộ phận các khung hình này được thiết kế để hoạt động biệt lập với các khung hình khác, song lại tạo nên nhiều chức năng tốt hơn khi được phối hợp làm việc với nhau. Những khung hình này được phân loại theo các khối nền cơ bản mà những chương trình phần mềm phức tạp điển hình thường sử dụng:

* **Khung chứa [[đảo ngược khống chế|đảo ngược quyền điều khiển]]** (*Inversion of Control container*): Sự cài đặt các thành phần của chương trình ứng dụng và quản lý chu trình của các đối tượng trong Java (*lifecycle management of Java objects*).
* **Khung hình [[lập trình định dạng|lập trình hướng khía cạnh]]** (*Aspect-oriented programming framework*): Spring AOP module tích hợp chức năng lập trình hướng khía cạnh vào Spring framework thông qua cấu hình của nó. Spring AOP module cung cấp các dịch vụ quản lý giao dịch cho các đối tượng trong bất kỳ ứng dụng nào sử dụng Spring. Với Spring AOP chúng ta có thể tích hợp declarative transaction management vào trong ứng dụng mà không cần dựa vào EJB component.
Spring AOP module cũng đưa lập trình metadata vào trong Spring. Sử dụng cái này chúng ta có thể thêm annotation vào source code để hướng dẫn Spring nơi và làm thế nào để liên
hệ với aspect..
* **Khung hình [[truy cập dữ liệu]]** (*Data access framework*):Tầng JDBC và DAO đưa ra một cây phân cấp exception để quản lý kết nối đến database, điều khiển exception và thông báo lỗi được ném bởi vendor của database. Tầng exception đơn giản điều khiển lỗi và giảm khối lượng code mà chúng ta cần viết như mở và đóng kết nối. Module này cũng cung cấp các dịch vụ quản lý giao dịch cho các đối tượng trong ứng dụng Spring..
* **Khung hình [[quản lý giao dịch]]** (*Transaction processing / Transaction management framework*): Sự đồng hòa các API quản lý giao dịch và sự điều hợp quản lý giao dịch đối với các đối tượng Java dùng phương pháp cài đặt.
* **Khung hình [[mô hình-giao diện-điều khiển]]** (*Model-view-controller framework*): Khung hình dựa trên nền tảng HTTP và Servlet cung cấp rất nhiều móc điểm có thể mở rộng và cải biên (*extension and customization*).
* **Khung hình truy cập từ xa** (*Remote Access framework*): Xuất nhập khẩu các đối tượng Java trên mạng lưới truyền thông hỗ trợ các giao thức dựa trên nền HTTP, sử dụng phong cách RPC (*Remote procedure call*) thông qua cài đặt, như RMI (*Java remote method invocation* - khởi động phương pháp từ xa trong Java), CORBA và dịch vụ mạng (web services - SOAP).
* **Khung hình [[xác thực]] và [[ủy quyền]]** (*Authentication and authorization framework*): Sự điều hợp các quá trình xác thực và ủy quyền thông qua cài đặt hỗ trợ nhiều tiêu chuẩn công nghiệp và những tiêu chuẩn được sử dụng phổ biến, cũng như các giao thức, công cụ và các thói quen thực hành phổ dụng.
* **Khung hình quản lý từ xa** (*Remote Management framework*): Sự quản lý và quảng bá các đối tượng Java đối với các bố trí địa phương và bố trí ngoại biên thông qua JMX (*Java Management Extension* - quản lý mở rộng của Java cho phép các phần mềm không trực thuộc Java có thể lắp ráp vào và sử dụng được trong nền tảng Java).
* **Khung hình truyền thông điệp** (*Messaging framework*): đăng ký các đối tượng lắng nghe thông điệp dùng để tiếp thu và sử dụng thông điệp từ các hàng thông điệp (*message queue*) thông qua JMS (*Java Message Service* - Dịch vụ Thông điệp của Java), cải tiến việc truyền gửi thông điệp dùng tiêu chuẩn trong API của JMS.
* **Khung hình [[kiểm thử (phần mềm)|kiểm thử phần mềm]]** (*Software testing framework*): Những chủ thể (lớp) hỗ trợ việc viết các kiểm thử đơn vị và các kiểm thử tích hợp (*unit tests and integration tests*).

### Khung chứa đảo ngược quyền khống chế
:*Bài chính: [[Khung chứa cốt lõi của Spring]] (Spring core container)*
Trọng tâm của Spring Framework là khung chứa đảo ngược quyền khống chế (*Inversion of Control*). Nó được sử dụng để cung cấp một phương pháp kiên định cài đặt và quản lý các đối tượng Java. Khung hình này còn được gọi là *BeanFactory* (Chủ thể chế xuất Bean), *ApplicationContext* (Ngữ cảnh của chương trình ứng dụng) và "khung chứa cốt lõi" (*Core container*).

Khung chứa có rất nhiều trách nhiệm và nhiều điểm mở rộng, và chúng hầu hết đều được coi như là những hình thức của đảo ngược quyền khống chế, thế cho nên mới có cái tên như vậy. Những ví dụ bao gồm: việc kiến tạo đối tượng, cài đặt đối tượng, khởi động các phương pháp khởi tạo (*calling initialization methods*) và truyền giao các đối tượng sang cho các đối tượng gọi lại đã đăng ký (*registered callback objects*). Tổ hợp của các chức năng trong khung chứa tạo nên chu kỳ của đối tượng và đây cũng chính là một trong những đặc trưng trọng yếu mà nó cung ứng.

Đối tượng do khung hình kiến tạo còn được gọi là "đối tượng đã quản" (*Managed Objects*) hoặc chủ thể "Beans". Trong những trường hợp điển hình, khung hình được cài đặt bằng cách đọc các văn bản XML có chứa các "định nghĩa về chủ thể" (*Bean definitions*). Những bản định nghĩa này cung cấp các thông tin cần thiết để kiến tạo các đối tượng. Một khi các đối tượng đã được tạo dựng và cài đặt mà không có lỗi (*without raising error conditions*) thì chúng sẵn sàng để sử dụng. Người ta có thể truy cập các đối tượng bằng các phương pháp truy vấn phần phụ thuộc (*Dependency lookup*) hay DI (*Dependency injection*).

"Truy vấn phần phụ thuộc" là một mẫu hình, trong đó một chủ thể (*caller*) yêu cầu khung chứa đưa cho nó một đối tượng bằng một cái tên, hoặc một kiểu dữ liệu cụ thể (*specific type*) nào đấy. DI là một mẫu hình mà trong đó khung chứa truyền giao các đối tượng cho nhau bằng tên của chúng, thông qua những phương pháp khởi tạo (*constructor*), các đặc tính (*properties*) hoặc các phương pháp chế xuất (*factory methods* / *Factory method pattern*).

Trong nhiều trường hợp, khi sử dụng những phần khác của Spring Framework, yêu cầu sử dụng khung chứa không nhất thiết là một việc bắt buộc, song việc không sử dụng khung hình Spring rất có thể sẽ làm cho việc cài đặt và cải biên chương trình ứng dụng khó khăn hơn. Khung hình Spring cung cấp một cơ chế nhất quán ổn định cho việc cài đặt và tích hợp các chương trình ứng dụng với hầu hết các môi trường Java, từ những ứng dụng dùng trong phạm vị nhỏ cho đến các ứng dụng kinh doanh trên phạm vi lớn.

Khung chứa có thể được cải biến trở thành một khung hình tương thích với EJB3 bằng cách sử dụng đề án Pitchfork . Bản thân đề án này không làm cho khung chứa hoàn toàn tương thích với đặc tả EJB3. Spring Framework bị một số chỉ trích cho rằng nó không tuân theo các tiêu chuẩn. Interface21  cho rằng việc tương thích với EJB3 không phải là một mục đích chính và tuyên bố rằng Spring Framework cùng khung chứa cho phép các mô hình lập trình có hiệu lực hơn sinh trưởng.

## Tham khảo
*
*
*
*
*
*

## Tham khảo

## Liên kết ngoài
* Spring Framework
* Spring.Net