BackGroundSự liên kết giữa: SpringIocContainer | ApplicationContext | WebApplicationContext
Sau khi đọc từ 123456 Liên kết tôi đạt đến sau conclusion-
Như Xuân MVC được thiết kế trên standered servlets
, và tạo điều kiện cùng một chức năng của servlet context
và application context
.Tại mùa xuân có hai loại ngữ cảnh ApplicationContext
và WebApplicationContext
-
ApplicationContext
khởi tạo bởi ContextLoaderListener
, một lần cho mỗi ứng dụng. WebApplicationContext
được tải bởi mỗi DispatcherServlet
.
Chúng ta có thể hiểu ở trên như ApplicationContext
này kéo dài bởi WebApplicationContext
vì vậy những gì từng thứ gắn liền với ApplicationContext
ở cuối này là một phần của WebApplicationContext
.
nghi ngờ
ApplicationContextAware
Mời màcontext
đối tượng.public class SomeThing implements ApplicationContextAware{ @Override public void setApplicationContext(ApplicationContext ctx) throws BeanException{ //this context object is `ApplicationContext` or `WebApplicationContext`? } }
context
vàcontainer
dường như đồng nghĩa với hầu hết chúng ta, tôi muốn đưa ra một example.Let nói rằng chúng ta có hai servlet phối một chorest
và khác chomvc
.Đầu tiên Dispatcher -
public class RestInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected String[] getServletMappings() { return new String[] { "/rest/*" }; } }
Second Dispatcher -
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected String[] getServletMappings() { return new String[] { "/mvc/*" }; } }
hơn ở đây có hai thể hiện của
WebApplicationContext
, những phần chung được nạp bởiContextLoaderListner
như định nghĩa trongrootContext
.Tôi không chắc chắn, nhưng không được có 2 IocContainer trong một SpringApplication đơn lẻ.
BeanFactory tức SpringIocContainer là, nơi tất cả các đối tượng đậu cuộc sống, những gì từng đối tượng chúng tôi cộng với
WebApplicationContext
là phần của container mùa xuân, như thế nào chứa này được khởi tạo bởiWebApplicationContext
? Tôi muốn muốn biết làm thế nào họ cả hai có liên quan với nhau không?Và bất cứ khi nào chúng tôi đã làm
ctx.getBean()
- điều này trả về đối tượng từ mùa xuân container, làm thế nào giao tiếp này giữa bối cảnh và container sẽ xảy ra?
Có một tương tự answer mà phủ nhận cả hai đều giống nhau, nó nói
mùa xuân đi kèm với một số triển khai container, Cả hai định nghĩa bean tải, dây đậu với nhau, và phân phát các bean theo yêu cầu, nhưng một ApplicationContext cung cấp nhiều hơn nữa.
Vì vậy, quan điểm của tôi là lý do cả hai định nghĩa hạt tải, hạt dây với nhau, đây là loại làm lại?
Một điều nữa mặc dù ứng dụng web được mùa xuân hướng hay không, thì phải có một bối cảnh mà standard servlet
cung cấp và sử dụng trong giao tiếp Http ......
mùa xuân sau này hoặc mùa xuân xử lý này trong một số manner.And khác vào mùa xuân context
có nghĩa là một chỉ IOC container
, trong đó một số phần được tải bởi DispacherServlet
và một số phần được tải bởi ContextLoaderListner
và có thể tạo điều kiện nhiều hơn nữa như I18N
, access to static resource
vv ..
Một 'WebApplicationContext' là một' ApplicationContext'. Cả hai 'ContextLoaderLIstener' và' DispatcherServlet' nạp một cá thể của 'WebApplicationContext' (thực ra là một giao diện). Chỉ có một 'ApplicationContext' bất chấp thực tế nếu nó là web hoặc không liên quan đến web. 'ApplicationContext' LÀ vùng chứa. –
@ M.Deinum Khi bạn chỉ có một 'ngữ cảnh' cho mỗi ứng dụng, có rất nhiều whitepapers đã giải thích sự tồn tại của cả hai, một số trong số chúng được đề cập trong câu hỏi chính nó.Ngay cả nếu bạn khởi tạo ngữ cảnh của mình bằng' DispatcherServlet' chỉ có nghĩa là không 'ContextLoaderListner' ans gọi bảo mật mùa xuân' 'điều này sẽ ném' IllegalStateException: Không có ApplicationContext tìm thấy: ' –
Không có nơi nào tôi chỉ ra rằng có một ngữ cảnh duy nhất ... có khái niệm 'ApplicationContext' .. Nó có thể thuộc kiểu' WebApplicationContext'. Có thể có 1 hoặc 100. Những gì tôi ám chỉ rằng cả hai 'ContextLoaderListener' và' DispatcherServlet' tải một 'WebApplicationContext'. 'ContextLoaderLIstener' tải một ngữ cảnh thường được gọi là ngữ cảnh gốc, đó cũng là những gì các bộ lọc có thể truy cập. Bạn cũng có thể làm cho nó (nếu bạn có một 'DispatcherServlet' để lộ ra cái đó làm ngữ cảnh gốc (và đó thường là những gì mọi người quên dẫn đến vấn đề bạn trỏ vào)). –