咸鱼开发修炼之路

从零开始搭建REST风格的Spring项目(一)

  最近学习《SpringInAction》感觉收获不小,以前只是使用Spring进行开发,并不清楚Spring项目是如何跑起来的,自己试了下搭建简单Spring项目。
  Spring装配bean有三种主要方式:自动化配置、基于Java的显式配置和基于XML的显式配置。本项目大部分均采用自动化配置。web环境搭建则完全使用Java配置,放弃了传统的web.xml文件配置,使用maven工具进行版本管理。
  
45360644_p0.jpg

环境搭建

项目结构.png

  项目使用maven进行版本控制,pom文件可以去 这里 查看。

配置DispatcherServlet

  DispatcherServlet无疑是Spring MVC的核心,它负责将请求路由到其他组件中。按照传统一般在web.xml文件中进行配置,随着Servlet3 规范和Spring3.1的功能增强,现在可以尝试在Java代码中进行配置。
  这里采用继承AbstractAnnotationConfigDispatcherServletInitializer类的方法快速仅需配置,这个类是WebApplicationinitializer的基础实现。当部署到Servlet3.0容器的时候,容器会自动发现它并用来配置Servlet上下文。这个类有两个抽象方法:

  • getRootConfigClasses()
  • getServletConfigClasses()

  这两个类是做什么的呢?查阅官方文档后发现,在Spring MVC中我们其实是可以创建出多个DispatcherServlet的(只要创建多个继承自AbstractAnnotationConfigDispatcherServletInitializer的类即可)。而每个DispatcherServlet有自己的应用上下文(WebApplicationContext),这个应用上下文只针对这个DispatcherServlet有用。
  这也就是getServletConfigClasses的作用,获取这个DispatcherServlet的应用上下文的配置类。而除了每个DispatcherServlet配置类的应用上下文之外,还有一个根应用上下文,这个应用上下文的作用是为了在多个DispatcherServlet之间共享Bean,比如数据源Bean,这就是getRootConfigClasses的作用,用于返回根应用上下文的配置类。Spring框架的机制会保证如果在当前DispatcherServlet的应用上下文中没有找到想要的bean时,会去根应用上下文中去找。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
//该方法将有@Component注解或者@Component注解的配置类提供给根应用上下文
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
}
//将有@Component注解或者@Component注解的配置类提供给Servlet应用上下文
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}

配置Spring MVC

  过去一般采用<mvc:annotation-driven>启用注解驱动的SpringMVC,现在仅需在用于配置的Java类上加上@EnableWebMvc注解即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Configuration
@ComponentScan(basePackages = "core")
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
//配置jsp视图解析器
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/jsp");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
//配置静态资源处理
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}

配置RootConfig配置

这是根应用上下文的配置类,由于本次开发的web应用仅定义了一个DispatcherServlet,因此不需要什么配置。。。

1
2
3
4
5
@Configuration
@ComponentScan(basePackages = {"core"},
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
public class RootConfig {
}

@ComponentScan注解中指定扫描bean的位置。

定义控制器

1
2
3
4
5
6
7
8
@RestController
@RequestMapping("/")
public class TestController {
@RequestMapping(value= "/test/{test_name}",method = RequestMethod.GET)
public String getTestName(@PathVariable("test_name") String name){
return name;
}
}

用maven启动tomcat后,使用DHC插件进行接口测试
控制器测试.png

简单Spring项目算是搭建成功了。
代码在 SpringInActionDemo

下一节将继续说明如何添加对中文字符的支持和支持复杂类型。