关于Spring组件扫描冲突问题

  • 一般在开发时用到ssm时都会有spring.xml和springmvc.xml两个配置文件。但一直没认真钻研过问什么两个文件都要用<component-scan>扫描。
  • 只在spring配置文件中启用注解扫描(关闭springmvc扫描),扫描dao、service、controller。
      这种情况下,项目启动正常,但是无法处理我们的请求,鉴于springmvc容器是spring容器的子容器,我猜想由于controller中的所有请求处理方法我都是采用@requestMapping来进行配置的,requestMapping都是由我们的springMVC配置文件中配置的HandlerAdapter和HandlerMapping以及Resolver的Bean来进行处理(即使我们不在这里面配置,spingmvc也有默认的),但是父容器又不能访问子容器的bean,所以即使扫描了controller包也无法将controller的处理方法与我们的请求正确mapping,所以这里如果仅仅在spring中扫描所有包,项目是无法实现正常运转的。
      
    只在spring配置文件中启用注解扫描,扫描dao、service、controller,并且在spring配置文件中配置springmvc的HandlerAdapter和HandlerMapping以及Resolver。
      这种情况项目与我们一般配置的效果一样,这种情况就相当于我们在spring中也完成了spingmvc的配置,将原本应该在springmvc容器中的bean直接在spring中配置,虽然效果是一样的,但是不建议这种做。这种配置的结果也代表我们上一种情况出现的原因的猜想是对的,spring父容器无法访问springmvc中的bean,无法将扫描到的controller与请求url正确适配。
      
    在springMVC配置文件中启用注解扫描(关闭spring扫描),扫描dao、service、controller。
      这种情况下项目能正常跳转,但是我们通过@Transactional配置的service事务失效,这里是因为spring容器配置了事务管理器后,装配的service都是经过cglib代理过的实例,具有事务功能,而springmvc容器装配的service是没有进行代理处理的,所以是没有事务功能的,这一点可以参见这篇博客http://blog.csdn.net/haoyifen/article/details/51172647。这里我试着在springMVC配置文件中也配置了一个事务管理器过后,发现一切正常了,由springmvc装配的service同样也具备事务功能,这里就很奇怪,为什么父容器配置的事务管理器子容器无法使用呢?父容器中的bean子容器都是可以访问的,为什么没有使用呢?
    到这里差不多可以回答开始的问题了,为什么要在spring中扫描dao、service,因为通过spring容器扫描dao以及service可以进行事务的增强,如果你仅仅在一个子容器中进行事务的增强那么其他的serviceBean是不会被事务增强的(比如第四种情况中,如果我们在spring容器中手动配置一个bean,那么这个bean不是由springmvc装配的,而我们的事务管理器在springmvc中,这个bean就不具备事务的功能)。而controller之所以要在springmvc中配置,因为spring容器无法访问到springmvc容器的bean(HandlerAdapter和HandlerMapping以及Resolver等),无法完成请求与hander的正确适配,如果要强行实现,在spring中配置HandlerAdapter和HandlerMapping以及Resolver则显得太过牵强。在书上看到的一种说法是这样也体现了分层的概念,dao、service等web层都需要使用的bean应该直接在spring容器中装配,而controller这种则放在专门处理请求跳转的springmvc容器中,相对于将所有bean配置在spring容器中,也体现了权限控制的思想吧。

参考https://www.cnblogs.com/leo-song/p/7862959.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值