spring 父子容器

特殊说明:

ContextLoaderListener: 创建的容器为父容器(applicationContext.xml)

DispatcherServlet:创建的容器为子容器(appServlet-context.xml)

1、问题:同一个类可以被子容器和父容器同时生成实例吗?

答案:可以,并且是不同的实例

2、问题:如果一个类子容器(appServlet-context.xml)有实例,父容器(applicationContext.xml)也有实例,getBean 使用的是那个?

答案:

1、从父容器取:是父容器的实例,

2、从子容器取值:优先使用子容器的实例;子容器没有尝试去父容器取

3、问题:子容器(DispatcherServlet)支持 AOP吗?

答案:支持

注意:

1、要确保对应容器的配置文件(appServlet-context.xml/applicationContext.xml)拥有<aop:aspectj-autoproxy/> 等与AOP相关的配置

2、子容器配置的AOP 植入逻辑,对父容器无效;即配置仅对当前容器的实例有效;

本质上是因为创建实例时,因为当前容器有实现BeanPostProcessor接口的AnnotationAwareAspectJAutoProxyCreator 实例,创建bean对象时,生成了AOP代理,才具备AOP功能的。

4、问题:子容器是否支持事务?

答案:支持,同AOP,appServlet-context.xml文件必须有对应的配置

注意:

1、仅仅在appServlet-context.xml 配置<tx:annotation-driven/> ,非子容器加载的实例没有事务能力

2、在父子容器都配置 <tx:annotation-driven/>:是各自独立的事务,毫无关系。本质同AOP的原理


总结:

1、避免父子容器拥有共同的实例,是没有必要的使用方式。

     常见的资源初始化、预热多次;

     如果父子容器都有实例,而通过SpringUtil 的方式获取bean,就要看SpringUtil 所在的容器,来获取对应的bean,也容易混乱

2、事务一般不要放在子容器中,子容器应该仅仅存在 web相关的bean;这也间接说明@Transactional 不应该修饰controller

3、如果希望对子容器的实例拥有事务能力,需要确保<aop:aspectj-autoproxy/> 以及Aspect 配置在子容器中

 

http://wangxinchun.iteye.com/blog/2341197

猜你喜欢

转载自m635674608.iteye.com/blog/2398953
今日推荐