相信大家现在在使用spring项目开发时可能不只是单单使用spring一个框架进行开发, 可能会用到现在主流的ssm,spring和springmvc一起使用。
而在一起使用的时候我就发现了一个问题,在web.xml配置spring容器初始化的时候存在一个问题。
一般我们在配置spring容器初始化时都会用最常见的两种方式,用ContextLoaderListener初始化spring容器,用DispatcherServlet 初始化springmvc容器,但是我发现我就使用DispatcherServlet 初始化一个容器,只要同时将关于spring的配置文件都加载进来,项目也能正常的运行。
这个时候可能就引出了一个父子容器的概念。而典型的父子容器就是spring和springmvc同时使用的时候。分别ContextLoaderListener 创建的 容器是父容器,DispatcherServlet 创建的容器是子容器。
而父容器和子容器的区别。比如父容器有a.b.c三个bean对象,子容器有d.e.f三个bean对象,子容器就可以通过getBean方法调用父容器的a.b.c bean对象,而父容器不能通过getBean拿到子容器的d.e.f三个bean对象。但是这里有一个例外property-placeholder,容器中读取的配置文件就是私有的,互相不能访问。其中也要弄清楚的是父子容器并不是一种包含关系,而是平行关系,但是在子容器中有一个parent,指向父容器,也就是说子容器在通过getBean访问父容器中的bean对象时是通过parent访问。
这种做法的实际意思就是在一个JVM,只有一个树状结构的容器树。可以通过子容器访问父容器资源。就比如在实际开发中使用ssm框架,spring可以管理service,mapper,springmvc管理controller,mybatis编写mapper,controller就需要调用service,service调用mapper,因为springmvc容器是spring的子容器,可以通过父容器找到service和mapper,但是在service中却是找不到controller的。保证一种资源的局部性。