Toàn tập ApplicationContext trong Spring Framework

applicationcontext-la-gi-cach-su-dung-applicationcontext-nhu-the-nao applicationcontext-la-gi-cach-su-dung-applicationcontext-nhu-the-nao

bài viết trước,mình hướng dẫn các bạn cách tạo chương trình Hello World trong chương trình Spring Framework.Trong đó có sử dụng ApplicationContext,đây là một khung chứa của Spring.Tuy nhiên chưa chuyên sâu vào cách sử dụng ApplicationContext như thế nào cho hợp lý.Nên mình quyết định viết một bài nói về ApplicationContext trong Spring để bạn học lập trình spring hiểu sâu hơn.

Có thể bạn quan tâm :

Loạt bài hướng dẫn Spring Framework từ cơ bản đến nâng cao các bạn có thể tham khảo tại đây nhé.

or click vào link bên dưới :

Link : https://itphutran.com/category/spring-framework



ApplicationContext là gì?

ApplicationContext cũng tương tự như BeanFactory , cũng được sử dụng để mô tả Spring Container. Nó được xây dựng trên interface BeanFactory.

BeanFactory cung cấp các chức năng cơ bản trong khi ApplicationContext cung cấp các tính năng tiên tiến hơn cho các ứng dụng Spring cho nên đây là lý do mà ApplicationContext luôn được ưu tiên hơn BeanFactory và phù hợp với các ứng dụng J2EE hơn. ApplicationContext bao gồm tất cả các chức năng của BeanFactory.

Đối tượng của interface ApplicationContext như là một khung chứa của Spring để gọi đến đối tượng mình cần lấy.

ApplicationContext luôn được ưu tiên hơn BeanFactory và phù hợp với các ứng dụng J2EE hơn
ApplicationContext luôn được ưu tiên hơn BeanFactory và phù hợp với các ứng dụng J2EE hơn

 

ApplicationContext và Singleton beans (Sự khác biệt giữa ApplicationContext  và BeanFactory ):

  • Điểm giống nhau : ApplicationContext và BeanFactory là đều cung cấp khả năng lấy đối tượng chúng ta cần trong khung chứa của Spring Framework bằng cách sử dụng phương thức getBean().
  • Điểm khác nhau :

Trong khi sử dụng BeanFactory , hạt đậu (bean) sẽ được hiển thị khi chúng được yêu cầu lần đầu tiên, như trong phương thức getBean (“bean_id”) , không phải khi đối tượng của BeanFactory được tạo ra. Đây được gọi là lazy-instantiation.

Nhưng trong khi sử dụng ApplicationContext, bean singleton không bị  lazily (lười biếng) . Theo mặc định, ApplicationContext ngay lập tức khởi tạo các hạt Singleton và thiết lập các thuộc tính của nó khi chính đối tượng của nó được tạo ra hay các bạn có thể hiểu là ApplicationContext sẽ tạo  tất cả các đối tượng chúng ta cần ngay khi bạn gọi đến khung chứa của Spring. Vì vậy, ApplicationContext tải bean Singleton eagerly (pre-instantiated ).

Để hiểu rõ hơn nữa về vấn đề này,mình sẽ viết ở một bài khác chứ không tạo ra ví dụ ở đây vì nó quá dài.

Ví dụ :

ApplicationContext acObj = new ClassPathXmlApplicationContext (“beanconfig.xml”);

MyBean beanObj = (MyBean) acObj.getBean (“mybean”);

BeanObj.someMethod ();

 

Trong ví dụ trên,tôi đã tạo ra một ApplicationContext đối tượng acObj sử dụng nếu triển khai của nó là ClassPathXmlApplicationContext,thì lúc này nó sẽ tải các cấu hình từ nguồn beanconfig.xml dưới classpath.

Nếu chúng ta đã sử dụng BeanFactory ở đây, mybean sẽ nhận được instantiated (thể hiện) khi getBean phương pháp (mybean) sẽ được gọi.

Nhưng ở đây với ApplicationContext , instantiation của bean với id mybean không bị delayed cho đến khi phương thức getBean () được gọi. Nếu phạm vi của bean mybean  được khai báo trong tập tin cấu hình như singleton , nó sẽ ngay lập tức được khởi tạo khi chúng ta tạo ra ApplicationContext đối tượng acObj . Vì vậy, khi getBean () thì đối tượng  sẽ được gọi, mybean sẽ được nạp nếu có và  phụ thuộc vào cài đặt của chúng ta.

Chúng ta có thể thay đổi hành vi mặc định này để ApplicationContext không tải singleton beans eagerly bằng cách sử dụng thuộc tính lazy-init như sau:

<bean id=”mybean” class=”x.y.z..MyBean” lazy-init=true“/>

 

Một lazy-initialized khởi tạo cho Spring để tạo ra một trường hợp cho bean khi nó được yêu, chứ không phải tại thời điểm mà đối tượng của ApplicationContext được tạo ra.

Có thể nói cả hai BeanFactory và ApplicationContext đều cung cấp tính năng Dependency Injection của Spring.Tuy nhiên BeanFactory  chỉ cung cấp những tính năng cơ bản, còn ApplicationContext cung cấp những chức năng khác nâng cao hơn.

Cách sử dụng ApplicationContext như thế nào?

Có rất nhiều hiện thực của interface ApplicationContext. Những điều quan trọng các bạn cần chú ý là:

1)   ClassPathXmlApplicationContext:

Nó tải các định nghĩa bean từ các tệp tin XML nằm trong đường dẫn classpath.

Ví dụ 1:

ApplicationContext context = new ClassPathXmlApplicationContext (“myconfig.xml”);

Ví dụ 2 : Nạp cấu hình từ nhiều file xml :

ApplicationContext context = new ClassPathXmlApplicationContext(
newString[]{“servicesconfig.xml”,”daoconfig.xml”});

 

2) FileSystemXmlApplicationContext:

Nó tải các định nghĩa bean từ các tệp tin XML trong hệ thống tập tin.

Ví dụ :        

ApplicationContext context = new FileSystemXmlApplicationContext (“c: /myconfig.xml”);

 

3) XmlWebApplicationContext:

XmlWebApplicationContext được sử dụng để đại diện cho Spring container cho web applications.Mặc định Spring tạo ra đối tượng của XmlWebApplicationContext – lớp đại diện cho ứng dụng bối cảnh  là thùng chứa của Spring cho các ứng dụng web.

Nó tải các định nghĩa bean từ một tệp tin XML chứa trong một ứng dụng web. Theo mặc định, nó tải cấu hình từ tệp có đường dẫn “/WEB-INF/applicationContext.xml”.

Nếu chúng ta muốn tải các định nghĩa bean từ nhiều tệp xml, chúng ta có thể chỉ định vị trí của chúng trong tham sốcontextConfigLocation của ContextLoaderListener hoặc DispatcherServlet trong web.xml.

XmlWebApplicationContext là một implementation của WebApplicationContext, nó sẽ extends từ ApplicationContext.

 

4) AnnotationConfigApplicationContext:

Lớp AnnotationConfigApplicationContext  được sử dụng với Java-based configuration cho các định nghĩa bean thay vì sử dụng các file Xml .

Trong việc triển khai ApplicationContext trên ( ClassPathXmlApplicationContext, FileSystemXmlApplicationContext ), chúng ta đã cung cấp cấu hình bean từ các file cấu hình xml. Lớp AnnotationConfigApplicationContext được sử dụng để tạo vùng chứa cho Spring chứa các định nghĩa bean từ các lớp java đã được chú giải bằng @Configuration, thay vì các tệp xml.

Phần này đã được đưa vào sử dụng và giới thiệu vào mùa xuân 3.0.

Ví dụ:

public static void main(String[]args){
/* Creating Spring IoC Container Without XML configuration file*/
ApplicationContext context= new AnnotationConfigApplicationContext(MyConfig.class);
MyBean beanObj = context.getBean(MyBean.class);beanObj.someMethod();
}

 

Trong đoạn code trên, AnnotationConfigApplicationContext chấp nhận lớp MyConfig là đầu vào. Ở đây chúng ta lấy các định nghĩa bean từ một lớp java có tên là MyConfig chú thích với @Configuration, thay vì cấu hình trong file Xml. class MyConfig được mô tả như sau:

@Configurationpublic class MyConfig{

@Bean

public MyBean myBeanId(){

return new MyBean();

}

}

Bằng cách đưa ra chú thích @Configuration chúng ta xử lý lớp Myconfig như <beans> </ beans>  Thẻ của file xml.

Bằng cách đưa ra chú thích @Bean chúng ta đang xử lý phương thức myBean () dưới dạng <bean id = “…” class = “…” />

 

 

Giống như XmlWebApplicationContext là đối tác web cho ClassPathXmlApplicationContext và FileSystemXmlApplicationContext và được sử dụng để tạo ra ngữ cảnh ứng dụng cho các ứng dụng web  , tương tự,AnnotationConfigWebApplicationContext là đối tác ứng web cho AnnotationConfigApplicationContext.

AnnotationConfigWebApplicationContext được sử dụng để tạo ra ngữ cảnh ứng dụng cho các ứng dụng web bằng cách sử dụng class java như là đầu vào cho các định nghĩa bean thay vì các file xml.

Theo mặc định Spring sử dụng XmlWebApplicationContext (một triển khai WebApplicationContext ) để tạo vùng chứa của Spring trong các ứng dụng web. Nhưng chúng ta có thể thay đổi giá trị mặc định này thành AnnotationConfigWebApplicationContext bằng cách thay đổi giá trị của tham số contextClass của ContextLoaderListener hoặc DispatcherServlet trong web.xml như thể hiện dưới đây:

Đối với ContextLoaderListener:<web-app>

<context-param>

<param-name>contextClass</param-name>

<param-value>

org.springframework.web.context.support.AnnotationConfigWebApplicationContext

</param-value>

</context-param>

<context-param>

<param-name>contextConfigLocation</param-name>

<!–MyConfig must be annotated with @Configuration–>

<param-value> MyConfig</param-value>

</context-param>

<listener>

<listener-class> org.springframework.web.context.ContextLoaderListener </listener-class>

</listener>

</web-app>

Đối với DispatcherServlet:

<web-app><servlet>

<servlet-name>mydispatcher</servlet-name>

<servlet-class > org.springframework.web.servlet.DispatcherServlet

</servlet-class>

<init-param>

<param-name>contextClass</param-name>

<param-value>

org.springframework.web.context.support.AnnotationConfigWebApplicationContext

</param-value>

</init-param>

<init-param>

<param-name>contextConfigLocation</param-name>

<!–MyConfig must be class annotated with @Configuration–>

<param-value> MyConfig </param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>mydispatcher</servlet-name>

<url-pattern>*.htm</url-pattern>

</servlet-mapping>

</web-app>


Tổng kết :

Tóm lại những gì mà mình muốn nói ở bài viết này,mục đích là để các bạn hiểu sâu hơn nữa về ApplicationContext trong Spring ,hiểu về cách sử dụng và triển khai của ApplicationContext.Cũng như ngoài cách gọi khung chứa của Spring bằng ApplicationContext thì các bạn cũng có thể thể sử dụng BeanFactory. Tuy nhiên với BeanFactory vì nó hỗ trợ các chức năng ít hơn so với ApplicationContext cho nên đa số chúng ta sử dụng ApplicationContext.

Qua đó,Tôi muốn biết ý kiến ​​của bạn và nếu bạn thích bài viết này thì hãy chia sẻ lên mạng xã hội cho mọi người cùng tìm hiểu nhé.