天天看点

《精通Spring MVC 4》——1.6 幕后的Spring Boot

本节书摘来自异步社区《精通spring mvc 4》一书中的第1章,第1.6节,作者:【美】geoffroy warin著,更多章节内容可以访问云栖社区“异步社区”公众号查看

如果你之前搭建过spring mvc应用,那么可能已经习惯于编写相关的xml文件或java注解配置类。

一般来讲,初始的步骤如下所示:

1.初始化spring mvc的dispatcherservlet;

2.搭建转码过滤器,保证客户端请求进行正确地转码;

3.搭建视图解析器(view resolver),告诉spring去哪里查找视图,以及它们是使用哪种方言编写的(jsp、thymeleaf模板等);

4.配置静态资源的位置(css、js);

5.配置所支持的地域以及资源bundle;

6.配置multipart解析器,保证文件上传能够正常工作;

7.将tomcat或jetty包含进来,从而能够在web服务器上运行我们的应用;

8.建立错误页面(如404)。

不过,spring boot为我们处理了所有的事情。因为这些配置一般是与应用相关的,所以你可以无限制地将它们进行组合。

在一定程度上来讲,spring boot是带有一定倾向性的spring项目配置器。它基于约定,并且默认会在你的项目中使用这些约定。

1.6.1 分发器和multipart配置

接下来,让我们看一下在幕后到底发生了什么。

我们使用默认生成的spring boot配置文件,并将其设置为debug模式。在src/main/resources/ application.properties中添加下面这一行:

<code>debug=true</code>

现在,如果重新启动应用的话,就能看到spring boot的自动配置报告。它分为两部分:一部分是匹配上的(positive matches),列出了应用中,所有的自动配置,另一部分是没有匹配上的(negative matches),这部分是应用在启动的时候,需求没有满足的spring boot自动配置:

仔细看一下dispatcherservletautoconfiguration:

这是一个典型的spring boot配置类。

与其他的spring配置类相同,它使用了@configuration注解;

一般会通过@order注解来声明优先等级,可以看到dispatcherservletautoconfiguration需要优先进行配置;

其中也可以包含一些提示信息,如@autoconfigureafter或@autoconfigurebefore,从而进一步细化配置处理的顺序;

它还支持在特定的条件下启用某项功能。通过使用@conditionalonclass (dispatcherservlet.class)这个特殊的配置,能够确保我们的类路径下包含dispatcherservlet,这能够很好地表明spring mvc位于类路径中,用户当前希望将其启动起来。

这个文件中还包含了spring mvc分发器servlet和multipart解析器的典型配置。整个spring mvc配置被拆分到了多个文件之中。

另外,值得一提的是,这些bean会遵循特定的规则,以此来检查是否处于激活状态。在@conditional(defaultdispatcherservletcondition.class)条件满足的情况下,servletregistrationbean函数才会启用,这有些复杂,但是能够检查在你的配置中,是否已经注册了分发器servlet。

只有在满足@conditionalonmissingbean(name=dispatcherservlet.multipart_resolver_ bean_name)条件的情况下,multipartresolver函数才会处于激活状态,例如,当我们自己还没有注册的时候。

这意味着spring boot仅仅是基于常见的使用场景,帮助我们对应用进行配置。不过,可以在任意的地方覆盖这些默认值,并声明自己的配置。

因此,通过查看dispatcherservletautoconfiguration,就了解了为什么我们已经拥有了分发器servlet和multipart解析器。

1.6.2 视图解析器、静态资源以及区域配置

另外一个密切相关的配置是webmvcautoconfiguration,它声明了视图解析器、地域解析器(localeresolver)以及静态资源的位置。视图解析器如下所示:

视图解析器的配置并没有什么特殊之处,这里真正有意思的是使用了配置属性,从而允许用户对其进行自定义。

它的意思就是说“将会在用户的application.properties文件中查找两个变量,这两个变量的名字是spring.view.prefix和spring.view.suffix”。在配置中只需两行代码就能将视图解析器搭建起来了,这是非常便利的。

为了下一章内容的讲解,你需要牢记这一点,不过,我们现在会继续浏览spring boot的代码。

关于静态资源,配置中包含了如下的内容:

资源位置的声明有点复杂,但是通过它,我们可以了解到以下两点:

对带有“webjar”前缀的资源访问将会在类路径中解析。这样的话,我们就能使用mavan中央仓库中预先打包好的javascript依赖;

我们的静态资源需要放在类路径中,并且要位于以下4个目录中的任意一个之中,“/meta-inf/resources/”“/resources/”“/static/”或“/public/”。

《精通Spring MVC 4》——1.6 幕后的Spring Boot

webjars是jar包格式的客户端javascript库,可以通过maven中央仓库来获取。它们包含了maven项目文件,这个文件允许定义传递性依赖,能够用于所有基于jvm的应用之中。webjars是javascript包管理器的替代方案,如bower或npm。对于只需要较少javascript库的应用来说,这种方案是很棒的。你可以在www.webjars.org站点上看到所有可用的webjars列表。

在这个文件中,还专门有一部分用来声明地域管理:

默认的地域解析器只会处理一个地域,并且允许我们通过spring.mvc.locale配置属性来进行定义。