Application context là gì

Toàn tập ApplicationContext trong Spring Framework

5 năm ago
IT Phú Trần
11 minutes

Ở 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ụngApplicationContext,đâ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ụngApplicationContext 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



Nội dung bài viết (click vào để đến nội dung bạn cần đọc) :

1.ApplicationContext là gì?

2.Cách sử dụng ApplicationContext như thế nào (Phân biệt ApplicationContext và BeanFactory )?

3.Tổng kết

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àApplicationContextluôn được ưu tiên hơnBeanFactory 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ộtkhung chứa của Spring để gọi đến đối tượng mình cần lấy.

Application context là gì
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, beansingleton 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 Singletoneagerly (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-initnhư sau:

<beanid=mybeanclass=x.y.z..MyBeanlazy-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ăngDependency Injection của Spring.Tuy nhiênBeanFactory chỉ cung cấp những tính năng cơ bản, còn ApplicationContext cung cấpnhữ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 interfaceApplicationContext. 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 Springcontainer 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 Springcho 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.

Application context là gì

4) AnnotationConfigApplicationContext:

Lớp AnnotationConfigApplicationContext được sử dụng vớiJava-based configurationcho 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 filecấ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. classMyConfig đượ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 = />

Application context là gì

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 Springtrong các ứng dụng web. Nhưng chúng ta có thể thay đổi giá trị mặc định này thànhAnnotationConfigWebApplicationContextbằng cách thay đổi giá trị của tham số contextClass củaContextLoaderListener 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 annotatedwith@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 classannotatedwith@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ómlạ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ề ApplicationContexttrong 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ớiApplicationContextcho nên đa số chúng ta sử dụngApplicationContext.

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é.

#ApplicationContext là gì? #ApplicationContext trong java là gì? #ApplicationContext trong spring là gì? #beanfactory là gì #Cách sử dụng ApplicationContext #Cách sử dụng ApplicationContext trong java #Cách sử dụng ApplicationContext trong spring #học spring #học spring framework #lập trình spring #lập trình spring framework #phân biệt ApplicationContext và beanfactory #phân biệt Cách sử dụng ApplicationContext và Beanfactory