I. Giới thiệu về Spring
Spring là một application framework mã nguồn mở, được giới thiệu vào năm 2002. Rod Johnson đã đưa ra ý tưởng này từ kinh nghiệm làm việc với kiến trúc J2EE.
Ông ta đã viết cuốn sách với tiêu đề: “J2EE Develoment without using EJB” để giới thiệu khái niệm trình chứa hạng nhẹ (lightweight container). Với lý luận: EJB thì có giá trị của nó, nhưng không phải lúc nào cũng cần thiết và phù hợp cho tất cả các ứng dụng.
Như Hibernate chống lại CMP về nguyên lý cơ bản của kỹ thuật ORM, Spring chống lại EJB vì sự phức tạp và không phù hợp cho các unit test. Thay vì EJB, Spring sử dụng Java bean, với một vài sự thay đổi để thu được tất cả các thuận lợi mà môi trường EJB đưa ra. Do đó Spring là một sự lựa chọn khác so với EJB.
Trong Spring, chúng ta có thể sử dụng Java Bean để rút trích các thuộc tính mà lúc trước chỉ có thể với EJB. Mục tiêu chính của Spring là đơn giản việc phát triển J2EE và testing.
EJB được xuất hiện vào 1988 và là một chuẩn, đặc tả trong thế giới Enterprise. Mặc dù có một số kỹ thuật Java gần đây, nhưng không có kỹ thuật nào đáng kể so với EJB về mặt tổng các đặc tính của nó.
Theo Rod Johnson thì EJB không phức tạp nhưng nó cố gắng cung cấp cách giải quyết cho các vấn đề phức tạp. EJB được phát triển chính cho các ứng dụng phân tán. Nhưng một số enterprise project không có mức độ phức tạp và vẫn sử dụng EJB. Chính sự điều này là nguyên nhân làm cho các ứng dụng đơn giản trở nên phức tạp. Trong trường hợp này thì Spring là một sự chọn lựa.
Thuận lợi của EJB:
- Transaction Management (Quản lý transaction)
- Declarative Transaction support
- Persistence ( CMP & BMP)
- Declarative Security
- Distributed Computing (Container managed RPC)
Spring không cố gắng làm lại mọi thứ nhưng hỗ trợ những kỹ thuật tốt nhất cho mỗi yêu cầu.Thay vì CMP & BMP, Spring hỗ trợ một vài kỹ thuật persistence khác như JDO, Hiberbate và OJB. Các ORM tool này thì có nhiều khả năng cài đặt hơn CMP.
Spring sử dụng Acegi, một security framework mã nguồn mở và cung cấp để khai báo security thông qua cấu hình Spring hoặc class metadata, trong khi EJB khai báo security được cấu hình thông qua mô tả demployment. Spring cung cấp proxying cho RMI (kỹ thuật remoting đặc biệt như Burlap) JAX-RPC & web-service, trong khi EJB cung cấp lời gọi phương thức ở xa được quản lý bởi container.
Spring có thể cung cấp khai báo transaction như EJB. Hơn nữa, Spring còn cung cấp khai báo thủ tục rollback cho các phương thức và exception.
Do đó, trong khi EJB thì cứng và cố gắng làm mọi thứ, một vài công việc tốt nhưng một số thì không. Spring chỉ sử dụng Java Bean và thông qua một số kỹ thuật đặc biệt để cung cấp nhiều chức năng như EJB, bằng cách tích hợp với một số kỹ thuật open source khác.
Do đó, nó cung cấp một vài thuận lợi hơn EJB như:
- Testing dễ dàng hơn – không cần khởi động EJB container để test.
- Spring dựa vào quy ước của chuẩn Java Bean, nên các lập trình viên dễ dàng hơn khi làm việc với nó.
- Spring sử dụng AOP (Aspect-Oriented Programming), mô hình hữu ích để bổ sung vào OOP truyền thống và bảo toàn tính nguyên vẹn của OOP.
- Nó thì uyển chuyển trong việc gắn kết khi tích hợp với nhiều framework khác.
1. Core Container:
Core container cung cấp chức năng cơ bản của Spring. Thành phần chính của nó là Bean Factory, một cài đặt của Factory pattern. BeanFactory áp dụng IoC pattern để đặc tả sự phụ thuộc từ code của ứng dụng.
2. Spring Context/Application Context:
Spring context là một file cấu hình để cung cấp thông tin ngữ cảnh của Spring. Spring context cung cấp các service như JNDI access, EJB integration, e-mail, internalization, validation, và scheduling functionality.
3. Spring AOP (Aspect-Oriented):
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. Đặc điểm này làm cho người dùng có thể sử dụng annotation trong quá trình phát triển ứng dụng.
4. Spring DAO:
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.
5. Spring ORM:
Spring có thể tích hợp với một vài ORM framework để cung cấp Object Relation tool bao gồm: JDO, Hibernate, OJB và iBatis SQL Maps.
6. Spring Web module:
Nằm trên application context module, cung cấp context cho các ứng dụng web. Spring cũng hỗ trợ tích hợp với Struts, JSF và Webwork. Web module cũng làm giảm bớt các công việc điều khiển nhiều request và gắn các tham số của request vào các đối tượng domain.
7. Spring MVC Framework:
MVC Framework thì cài đặt đầy đủ đặc tính của MVC pattern để xây dựng các ứng dụng Web.
II. Các khái niệm chính của Spring:
Các khái niệm chính của Spring là: IoC và Aspect Orient Programming. Spring dựa vào Depenecy injection của IoC. Chúng ta không trực tiếp kết nối các component và service lại với nhau trong code mà thông qua file cấu hình. Một container thì chịu trách nhiệm móc nối nó. Khái niệm này thì tương tự với Declarative Management.
1. Dependency Injection:
Depedency injection là một pattern chịu trách nhiệm tạo đối tượng và các liên kết giữa các đối tượng bị loại bỏ ra khỏi các đối tượng và chuyển đến cho factory quản lý.
Các đối tượng của ứng dụng không chịu trách nhiệm tìm kiếm các resource mà chúng phụ thuộc. Và vì thế nên sự phụ thuộc được đảo ngược vào trong các đối tượng.
Theo phương pháp này, các đối tượng có thể được rút trích thông qua Setter Injection (các thuộc tính của Java-Beans) hoặc Constructor Injection (tham số của constructor). Mỗi phương thức có thuận lợi và bất lợi riêng.
Bình thường trong Java bean, chúng ta sử dụng phương thức setter và getter để thiết lập và lấy giá trị của thuộc tính như sau:
public class namebean {
String name;
public void setName(String a)
name = a;
}
public String getName()
{
return name;
}
}
Chúng ta sẽ tạo một thể hiện của bean “namebean” (gọi là bean1) và thiết lập thuộc tính: bean1.setName(“Tom”). Còn trong setter injection, chúng ta thiết lập thuộc tính “name” trong subelement <property> của thẻ <bean> trong file cấu hình Spring như sau:
<bean id=”bean1″ class=”namebean”>
<property name=”name” >
<value>Tom</value>
</property>
</bean>
Subelement <value> thiết lập thuộc tính “name” bằng cách gọi phương thức set như sau:
setName(“Tom”); => tiến trình này được gọi là setter injection.
Ví dụ về constructor injection, chúng ta sử dụng constructor với một tham số:
public class namebean {
String name;
public namebean(String a)
{
name = a;
}
}
Chúng ta sẽ thiết lập thuộc tính “name” trong khi tạo thể hiện của bean “namebean” như sau: namebean bean1 = new namebean(“Tom”);
Ở đây chúng ta sử dụng element <constructor-arg> để thiết lập thuộc tính sử dụng constructor injection như sau:
<bean id=”bean1″ class=”namebean”>
<constructor-arg>
<value>My Bean Value</value>
</constructor-arg>
</bean>
Để thiết lập các thuộc tính tham chiếu đến bean khác – <ref>, subelement <property> được sử dụng như sau:
<bean id=”bean1″ class=”bean1impl”>
<property name=”game”>
<ref bean=”bean2″/>
</property>
</bean>
<bean id=”bean2″ class=”bean2impl” />
2. Aspect-oriented Programming:
Kỹ thuật lập trình đưa ra cách phân chia các yêu cầu của hệ thống. Hệ thống được phân ra thành một vài component đảm trách một chức năng xác định. Bên cạnh các chức năng cơ bản thì các dịch vụ (yêu cầu hệ thống) như logging, transaction management, security…phải có trong chương trình. Các dịch vụ hệ thống này được gọi là ‘cross-cutting concern’ – nghĩa là chúng cắt chéo qua nhiều component trong hệ thống. AOP có khả năng module hóa các service này và sau đó cung cấp đến các component và chúng ta có thể tập trung vào yêu cầu chính (core concern). Trong Spring, lát cắt (aspect) được cắm vào trong các đối tượng của XML file như các JavaBean. Tiến trình này gọi là sự đan xen (weaving).
Container là khái niệm chính của Spring. Để quản lý vòng đời và cấu hình các đối tượng của ứng dụng. Chúng ta có thể cấu hình mỗi bean nên được tạo như thế nào hoặc làm thế nào để tạo một instance của bean hoặc làm thế nào kết hợp chúng lại. Spring không sử dụng các EJB container hạnh nặng. Spring có 2 container phân biệt: Bean Factory được định nghĩa bởi org.springframework. beans.factory.BeanFactory là một container đơn giản nhất, cung cấp hỗ trợ dependency injection. Application context được định nghĩa bởi org.springframework.context.ApplicationContext, cung cấp các service của application framework.
2.1. Bean Factory:
Bean factory được cài đặt theo design pattern factory và chức năng của nó là khởi tạo và phân phối các bean.
Beanfactory có một số implementattion. Một trong những implementation thường hay được sử dụng là org.springframework.beans.factory.xml.XmlBeanFactory. Spring sẽ load các bean dựa vào định nghĩa trong XML file. Để tạo một thể hiện của XmlBeanFactory, người dùng chỉ cần truyền vào constructor một inputstream. Resource này sẽ cung cấp XML cho factory.
BeanFactory factory = new XmlBeanFactory(new FileInputStream(“myBean.xml”));
Định nghĩa bean bao gồm mô tả bean và các thuộc tính của nó. Nhưng bean factory vẫn chưa khởi tạo nó. Để rút trích một bean từ BeanFactory, người dùng phải gọi phương thức getBean(). Khi phương thức getBean() được gọi, factory sẽ khởi tạo bean và bắt đầu thiết lập các thuộc tính của nó sử dụng depedency injection.
myBena bean1 = (myBean)factory.getBean(“myBean”);
2.2. Application Context:
Trong khi Bean Factory được sử dụng cho các ứng dụng đơn giản, thì Application Context là một container nâng cao của Spring. Giống như BeanFactory, nó có thể được sử dụng để load các định nghĩa bean, gắn các bean với nhau và phân phối các bean theo yêu cầu.
Nó cũng cung cấp:
- giải quyết text message, bao gồm hỗ trợ internationlization.
- cách chung để load file resource.
- các sự kiện để bean được đăng ký như các trình lắng nghe.
Có 3 cách sử dụng cài đặt Application Context:
- ClassPathXmlApplicationContext: Nó load định nghĩa context từ XML file được đặt trong classpath, xem các định nghĩa context như các tài nguyên của classpath. Ví dụ:
ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);
- FileSystemXmlApplicationContext: Spring sẽ load định nghĩa context từ XML file trong từ hệ thống file. Ví dụ Application Context được load từ hệ thống file như sau:
ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);
- XmlWebApplicationContext: Spring sẽ load các định nghĩa context từ XML file trong ứng dụng web.
Spring thì nhẹ về cả kích cỡ và chi phí. Toàn bộ framework có thể được phân phát trong JAR file chỉ hơn 1.7MB. Chi phí được yêu cầu bởi Spring thì không đáng kể. Và Spring không ràng buộc, ví dụ: các đối tượng trong ứng dụng Spring không phụ thuộc vào các class của Spring.
III. Release info:
Người dùng có thể download Spring framework ở trang http://www.springframework.org.
Nội dung của phân phối “-with-dependencies” (~60 MB):
* “dist” chứa các file jar của bảng phân phối và một file nén chứa tất cả source code.
* “docs” chứa tài liệu có định dạnh PDF, HTML và javadocs.
* “lib” chứa tất cả thư viện cần để xây dựng framework hoặc chạy các ví dụ.
* “src” chứa các file Java source của framework.
* “mock” chứa các file Java source cho mock và test.
* “test” chứa file java cho bộ test của Spring.
* “tiger/src” chứa các file JDK-1.5-specific Java source cho framework.
* “tiger/test” chứa các file JDK-1.5-specific Java source cho bộ test của Spring.
* “aspectj/src” chứa tất cả file AspectJ-specific source cho framework
* “aspectj/test” chứa tất cả file AspectJ-specific source cho cho bộ test của Spring.
* “samples” chứa các ứng dụng demo và chương trình giới thiệu.
Filed under: Java
Thank you so much!