文章截图来自:Spring-SpringMVC父子容器&AOP使用总结
链接描述
文章截图来自:Spring-SpringMVC父子容器&AOP使用总结
链接描述
类似于继承的思想,父类的方法和属性孩子可以继承,可以访问。但是孩子独有的属性和方法是父亲不能访问的。
一般来说:
父上下文容器中保存数据源、服务层、DAO层、事务的Bean。
子上下文容器中保存Mvc相关的controller的Bean。
比如controller需要使用父容器中的服务,存在调用关系,所以从设计上来说需要能访问父容器的bean。
父容器中的bean不需要使用子容器的bean,没有必要设计父容器可以访问子容器的。
如果你是spring中的编写者,你完全可以设计父容器可以访问子容器,只是这样做没有必要,也会造成混乱。
这个不需要从代码分析吧。逻辑很简单呀。
1.在子容器中找bean,找不到就到父容器中找。
2.在父容器中找bean,找不到就结束了。
首先我们的ssm项目基本都有如下配置文件:
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中配置扫描
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
类似于classloader 类加载