3 个回答

类似于classloader 类加载

类似于继承的思想,父类的方法和属性孩子可以继承,可以访问。但是孩子独有的属性和方法是父亲不能访问的。

一般来说:
父上下文容器中保存数据源、服务层、DAO层、事务的Bean。
子上下文容器中保存Mvc相关的controller的Bean。
比如controller需要使用父容器中的服务,存在调用关系,所以从设计上来说需要能访问父容器的bean。
父容器中的bean不需要使用子容器的bean,没有必要设计父容器可以访问子容器的。

如果你是spring中的编写者,你完全可以设计父容器可以访问子容器,只是这样做没有必要,也会造成混乱。

这个不需要从代码分析吧。逻辑很简单呀。
1.在子容器中找bean,找不到就到父容器中找。
2.在父容器中找bean,找不到就结束了。

首先我们的ssm项目基本都有如下配置文件:
clipboard.png
spring.xml就是父容器配置文件,spring-mvc.xml就是子容器配置文件。
我们可以在spring.xml中配置`<context:component-scan base-package="com.blog.service.impl"/>
`扫描service包。这是属于spring容器的。
同时会在spring-mvc.xml中配置<context:component-scan base-package="com.blog.controller"/> 扫描controller包,这是属于springmvc容器的。


子容器对父容器的中bean是可见的
即子容器可以访问父容器中的bean
所以我们将spring中的配置加入到spring-mvc.xml里:
此时spring-mvc配置中有
<context:component-scan base-package="com.blog.controller"/>
<context:component-scan base-package="com.blog.service.impl"/>

spring.xml删掉扫描包的配置。 启动tomcat,访问,没问题。


父容器对子容器的中bean不可见
验证一下,将spring-mvc.xml中扫描Controller的配置`<context:component-scan base-package="com.blog.controller"/>
`放到spring.xml中,启动并访问,会提示404,说明spring(父容器)并没有将sprngmvc(子容器)中的controller bean配置上。

所以实际应用的时候我们会在spring-mvc.xml中负责所有包的扫描<context:component-scan base-package="com.blog.*"/>,而不是在spring.xml中配置扫描

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题