联系
Knight's Tale » 技术

Spring MVC 配置小结

2014-12-22 21:19

Spring MVC 配置小结

spring mvc 作为非常 成熟的 J2EE 架构方案,适合大规模的业务平台架设。

它是spring项目的一部分,但是,在配置时,它一般的spring项目有点不一样。

springmvc配置与spring配置的关系

spring容器是 springmvc 容器的父容器,springmvc 可以访问 spring 容器,反之则不可。

可以通过这篇文章来了解:

http://sishuok.com/forum/blogPost/list/5188.html

如何打印spring调试日志

spring是采用 log4j 格式,可以在 log4j.properties 里添加

log4j.logger.org.springframework=INFO

来打印关键数据。

配置过程

springmvc 有一个配置文件,spring也有一个配置文件。那么,这两个文件的配置应该如何分配呢?这是最容易犯的错误。方法是:

The rule of thumb is: put every thing in the inner context, except that stuff that requires a Servlet context or is heavily tied to the Web-frontend, like MVC-Controllers, Tiles configuration, ....

也就是说,应该将尽可能多的配置放到 spring配置里,将 servlet或者web相关的放到 spring mvc配置里。

两个配置文件就是独立的,springmvc 配置 不能import spring配置(否则会出现 duplicate bean definition. 参见: http://stackoverflow.com/questions/22436195/all-spring-framework-beans-get-duplicated-becase-of-doubled-context-servletco

以下是另一些常见错误:

为何 Spring @transactional not working

如果你将自动导入

<context:component-scan base-package="com.baidu" />

放到 springmvc 配置文件里,就会出现这个问题。你会发现,啊,事务不起作用了啊!!!!!

原因看这里:

http://stackoverflow.com/questions/10019426/spring-transactional-not-working

这里我的理解是:因为 spring扫描了类,spring mvc也扫描了类,那么,事务注解到底是在spring容器里实现呢?还是在springmvc容器里呢?

如果是在spring容器里,那么,很OK,事务可以正常WORK。如果不幸在springmvc容器里,那么,事务就无法spring容器里实现了!

因此,解决办法就是,不要在springmvc进行扫描类!!

这时,你肯定会有疑问,那 springmvc 需要的类不扫描怎么办?回答是:spring容器帮你扫描了,springmvc是spring的子容器,它可以访问 那些controller类。

这里教大家一个技巧,如何判定事务有没有啊?方法是, 在 DataSourceTransactionManager 类里设置断点。 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html

为什么所有interceptor都不work了

请将所有interceptor 配置放到 spring配置里。

本文链接地址:Spring MVC 配置小结