Spring Bean 被加载两次问题讨论

上邪
  • 104

项目框架

Spring + Spring-MVC

情况说明

  • 在配置spring的配置文件applicationContext.xml的时候,需要剔除对@Controller的扫描
  • 在配置springmvc的配置文件springmvc.xml的时候,需要剔除其他的,只扫描@Controller

一些文章和网站说是为了各司其职,划清界限。

配置文件

applicationContext.xml

    <context:component-scan base-package="com">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

spring-mvc.xml

    <context:component-scan base-package="com" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

问题

  1. 如果我两个配置文件都不剔除任何配置,都扫描所有Bean然后加载,那么是会造成容器中有2个Bean吗,如果是这样会有什么影响?
  2. 有的配置会详细指定特别多的包,然后用逗号隔开,那我这样的直接从com开始,这样范围特别大,那会造成启动缓慢吗?
回复
阅读 999
2 个回答

spring已经考虑到这点了,包扫描的时候,会做校验的
image.png

我之前也遇到过这个问题,不过当时没有深入了解。依稀记得确实会产生两个bean,我当时是两个线程池。我刚才想复现这个问题,发现没有办法复现了,也许是新版springmvc 已经解决了这个问题。刚才也去看了下源码,从新版本的springmvc 也并未发现会产生如果两个beanFactory 同时注入controller ,就会产生错误的逻辑。我关注的是 requestHanlerMapping.afterPropertiesSet() 这个方法中加载处理方法的initHandlerMethods 这个方法。我担心新版有可能并不会产生这样的错误,所以在寻找一段时间之后就放弃了。

注入两个相同的bean 是可以复现的,但是cotroller 失效 确没有办法复现了。

 * @description 特别要注意此配置类扫面区域, mvc 和 spring 的扫描区域不同,
 * 如果此类刚好在spring 扫描范围内,如果在spring配置中排除了controller
 * 那就requestMappingHandler 就一个controller都不会加载,只会默认为普通的bean
 * <p>
 * 踩坑 2020-03-15
 * <p>
 * 其他:
 * 取消了<mvc:annotation-driven /> ,HttpMessageConverter 默认加载的没有了,
 * 如果出现异常,请切回原来调试
 * 或者看 <mvc:annotation-driven /> 的解析类
 */
@Configuration
@RequiredArgsConstructor
public class MvcConfig extends WebMvcConfigurationSupport {
}

这是我当年自己的注释,只写了结果,没写原因。

宣传栏