Spring Core – Phần 1: Spring IoC , Inversion of Control trong Spring

16 tháng 12, 2021 – 12040 lượt xemĐể hiểu rõ hơn về Spring :

Và cùng đến với Series Spring Core:

1. IoC là gì?

IoC(Inversion oControl): Đả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.

Các bạn hoàn toàn có thể xem lại bài về Dependency Injection để hiểu rõ hơn : https://stackjava.com/design-pattern/dependency-injection-di-la-gi.html

2. Spring IoC

IoC Container là thành phần triển khai IoC .Trong Spring, Spring Container ( IoC Container ) sẽ tạo những đối tượng người dùng, lắp rắp chúng lại với nhau, thông số kỹ thuật những đối tượng người tiêu dùng và quản trị 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 trị những thành phần, đối tượng người tiêu dùng để tạo nên 1 ứng dụng. Các thành phần, đối tượng người dùng này gọi là Spring Bean ( mình sẽ nói về Spring Bean trong những 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.Spring Core - Phần 1: Spring IoC, Inversion of Control trong Spring

IoC Container trong Spring có 2 kiểu là:

  • BeanFactory
  • ApplicationContext

Sự khác nhau giữa BeanFactory và ApplicationContext:

BeanFactory và ApplicationContext đều là những interface triển khai IoC Container. ApplicationContext được thiết kế xây dựng BeanFactory nhưng nó có thêm 1 số ít công dụng lan rộng ra như tích hợp với Spring AOP, giải quyết và xử lý message, context cho web application .

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 :



org.springframework

spring-beans

4.3.13.RELEASE

Class HelloWorld. java

public class HelloWorld {
  private String message;

  public void setMessage(String message) {
    this.message = message;
  }

  public void getMessage() {
    System.out.println("Print : " + message);
  }
}

Để tạo đối tượng người dùng HelloWorld trải qua IoC container ta sẽ thông số kỹ thuật nó trong file beans.xml





  
    
  

beans.xml là 1 file Spring Bean Configuration, nó có sẵn một số khai báo namespace trong tempalte, bạn có thể tạo 1 file xml rồi copy dữ liệu ở trên vào hoặc tạo file này bằng Spring Tool:

 

 

 

 

Bây giờ ta sẽ tạo một BeanFactory để đọc những thông tin thông số kỹ thuật và tạo ra đối tượng người dùng HelloWorl .BeanFactory chỉ là 1 interface, nên ở đây mình dùng DefaultListableBeanFactory, một implement của BeanFactory. Ở những version cũ thì bạn sẽ thấy hay sử dụng XmlBeanFactory nhưng nó bị lưu lại @ Deprecated ở những version mới .

// 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ả :

Print : Hello World!

3.2 Application Context

Để sử dụng Spring Bean ta cần khai báo thư viện spring-context sau :


  org.springframework
  spring-context
  4.3.13.RELEASE

Mình sẽ tạo đối tượng người dùng phức tạp hơn HelloWorl. java một chút ít .Ví dụ class DataResource. java chứa thông tin liên kết tới database .

public class DataResource {
  private String driverClassName;
  private String url;
  private String username;
  private String password;

  public String getDriverClassName() {
    return driverClassName;
  }

  public void setDriverClassName(String driverClassName) {
    this.driverClassName = driverClassName;
  }

  public String getUrl() {
    return url;
  }

  public void setUrl(String url) {
    this.url = url;
  }

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

  public void printConnection() {
    System.out.println("url: " + this.url + "\n" + "username/password: " + this.username + "/" + this.password);
  }
}

Để tạo đối tượng người dùng HelloWorld trải qua IoC container ta sẽ thông số kỹ thuật nó trong file applicationContext. xml ( chú ý quan tâm là bạn đặt tên file là gì cũng được : bean.xml, applicationContext. xml, dataresource.xml … nhưng cần phải nhớ file thông số kỹ thuật cho cái gì )




  
    
    
    
    
  

Tạo một đối tượng người dùng ApplicationContext để lấy thông tin từ file thông số kỹ thuật và tạo đối tượng người tiêu dùng DataResource

public static void main(String[] args) {
  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  DataResource obj = (DataResource) context.getBean("dataResource");
  obj.printConnection();
}

Kết quả :

url: jdbc:mysql://localhost/database_name
username/password: root/admin1234

Done !Bây giờ bạn muốn đổi khác messge trong đối tượng người tiêu dùng HelloWorld, hay database của bạn biến hóa username / password hay bạn đổi liên kết sang database khác bạn chỉ cần đổi lại thông tin trong file config. xml là đã biến hóa được luồng chạy của chương trình, đó chính là IoC .Thanks những bạn đã theo dõi !

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

Loạt bài chủ đề Java trên trang stackjava.com bản quyền thuộc thầy Trần Hữu Cương. Bài viết đăng trên blog Techmaster được sự đồng ý chấp thuận của tác giả .Thầy Trần Hữu Cương đã và đang tham gia giảng dạy tại Techmater khóa Lộ trình Java Spring Boot Full StackLink gốc bài viết tại đây .

Related Posts

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *