在 Spring MVC 的配置中我们提到 Spring MVC 有 2 次加载配置文件的时机:
-
第一次是通过 ContextLoaderListener 进行加载;
-
第二次是通过 DispatcherServlet 进行加载。
在这里,你的项目中先后创建了 2 个 Spring IoC 容器:
-
第一次加载时机所创建的 Spring IoC 容器习惯性被称作 Spring 容器,它是父容器;
-
第二次加载时机所创建的 Spring IoC 容器习惯性被称作 Spring Web 容器,它是子容器。
父容器-子容器的关系类似于父类-子类的关系:子容器中的对象能引用(<small>@Autowired</small>)父容器中的 Java Bean,但是反之则不行。
当然,同一容器内的 Java Bean 之间的 @Autowired 是毫无问题的。
结合我们平时在项目中的 MVC 三层的依赖关系和顺序:DAO 层被 Service 所使用,Service 层 Web 层所使用,所以,我们常见的配置的惯例是:
-
将 DAO 层和 Servic 层的 Java Bean 配置、创建在 ContextLoaderListener 所创建的父容器中;
-
将 Web 层和 Java Bean 配置、创建在 DispatcherServlet 所创建的子容器中;
这样,能确保 Web 层的 @Controller 能正常地 @Autowired Service 层的 Java Bean 。
网友评论