0

我正在使用带有 spring-mvc 和 spring-security 的 @Autowired 注释,它可以工作,但是 webapp 启动非常慢,每次大约 1 分钟,因为 spring-mvc 和 spring-security 扫描了所有自动装配的类和总数大约 500 个班级。有什么建议可以加快扫描时间吗?还是静态xml配置更好?

在 web.xml 中

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/rest-servlet.xml
    </param-value>
</context-param>
    <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

    <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

    <servlet>
    <servlet-name>rest</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
    <servlet-mapping>
    <servlet-name>rest</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
    ....

在 rest-sevlet.xml

    <context:component-scan base-package="com.mycomp" />
<mvc:annotation-driven />
<mvc:interceptors>
    ....
    </mvc:interceptors>
<import resource="classes/config/applicationContext-security-base.xml"/>
<import resource="classes/config/applicationContext-security.xml"/>

<import resource="classes/config/spring-aop.xml"/>
<!-- i18n --> 
<import resource="classes/config/spring-locale.xml"/>
4

1 回答 1

2

首先不要两次加载您的配置。目前两者ContextLoaderListener以及DispatcherServlet加载相同的配置文件。结果重复 bean 实例、重复扫描(以及未来的内存问题、奇怪的事务问题等)。

您的配置需要拆分。您ContextLoaderListener应该只加载对您的应用程序通用的东西(服务、存储库、数据源等)。反过来,DispatcherServlet 应该只包含/加载与 Web 相关的内容,如(@)Controllers, ViewResolvers, Views, mvc 配置等。

还要注意组件扫描,不要落入每个人都会做的陷阱。如果您将相同的comonent-scan 添加到每个配置文件,这将导致bean 重复(每个bean 都会被实例化两次)。因此,请确保您的ContextLoaderListener' scans for everything but controllers and that yourDispatcherServlet` 仅扫描与 Web 相关的内容(例如控制器)。

于 2013-11-07T16:03:22.360 回答