Professional Documents
Culture Documents
Spring Core
Spring Core
1. IoC là gì?
IoC(Inversion of Control): Đảo ngược điều khiển, nó giúp làm thay đổi
luồng điều khiển của chương trình một cách linh hoạt.
Thường dùng với Denpendency Injection.
2. Spring IoC
Trong Spring, Spring Container (IoC Container) sẽ tạo các đối tượng, lắp rắp chúng lại với nhau, cấu hình
các đối tượng và quản lý vòng đời của chúng từ lúc tạo ra cho đến lúc bị hủy.
Spring container sử dụng DI để quản lý các thành phần, đối tượng để tạo nên 1 ứng dụng. Các thành
phần, đối tượng này gọi là Spring Bean (mình sẽ nói về Spring Bean trong các bài sau)
Để tạo đối tượng, cấu hình, lắp rắp chúng, Spring Container sẽ đ ọc thông
tin từ các file xml và thực thi chúng.
3. Ví dụ với BeanFactory và
ApplicationContext.
3.1 BeanFactory
Để sử dụng Spring Bean ta cần khai báo thư viện spring-bean sau:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
Class HelloWorld.java
// tạo factory
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
// đọc thông tin file cấu hình và gán vào factory
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(new ClassPathResource("beans.xml"));
//tạo đối tượng từ factory
HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");
obj.getMessage();
Kết quả:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
Mình sẽ tạo đối tượng phức tạp hơn HelloWorl.java một chút.
Tạo một đối tượng ApplicationContext để lấy thông tin từ file c ấu hình
và tạo đối tượng DataResource
url: jdbc:mysql://localhost/database_name
username/password: root/admin1234
Khi nhắc tới Scope trong Spring người ta thường nói t ới Bean Scope
(Scope của các bean trong Spring).
Nó khác với scope trong JSP-Servlet mà tương tự bean scope trong JSF
Singleton: Chỉ duy nhất một thể hiện của bean sẽ được tạo cho mỗi container. Đây là
scope mặc định cho spring bean. Khi sử dụng scope này cần chắc chắn rằng các bean
không có các biến/thuộc tính được share.
Prototype: Một thể hiện của bean sẽ được tạo cho mỗi lần được yêu cầu(request)
Request: giống với prototype scope, tuy nhiên nó dùng cho ứng dụng web, một thể hiện
của bean sẽ được tạo cho mỗi HTTP request.
Session: Mỗi thể hiện của bean sẽ được tạo cho mỗi HTTP Session
Global-Session: Được sử dụng để tạo global sesion bean cho các ứng dụng Portlet.
Trong 5 scope trên thì 3 scope cuối chỉ dùng trong ứng dụng web.
Bạn cũng có thể tự định nghĩa các scope cho riêng mình, tuy nhiên các
scope cung cấp bởi spring dùng tốt và đáp ứng hầu hết các trường hợp.
Để thay đổi Scope của các bean bạn có thể định ngh ĩa nó trong file xml,
hoặc các annotation:
hoặc
Ví dụ sử dụng thư viện CDI, các framework như Spring, JSF c ũng đ ều h ỗ
trợ Denpendency Injection.
Trong Spring có 2 cách thực hiện Injection Dependency là: qua hàm
khởi tạo và qua hàm setter (By Constructor / By Setter method)
Code ví dụ:
applicationContext.xml
Person: stackjava.com Age: 25 Address: Address [country=Viet Nam, province=Ha Noi, district=Thanh Xuan]
Person: spring Age: 30 Address: Address [country=Viet Nam, province=Ha Noi, district=Thanh Xuan]
Address:
Email:
ghi@hotmail.com
klm@zzz.com
++++++++++++++++++++++++++++++++++
Address:
Email:
abc@gmail.com
def@yahoo.com
++++++++++++++++++++++++++++++++++
Các trường hợp dùng với Set, Map tương tự như List.