Servlet 3.0+ 規範支援 ServletContainerInitializer 機制,Spring 3.1 引入 WebApplicationInitializer,配合 @Configuration、@EnableWebMvc、@ComponentScan 等註解,完全可以用類型安全、IDE 友好、易重構的 Java 代碼替代冗長的 XML。優勢顯而易見:
@Conditional)靈活控制 Bean 裝載<dependencies>
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.30</version></dependency>
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency>
<dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency>
</dependencies>
<build>
<plugins>
<plugin><artifactId>maven-war-plugin</artifactId><version>3.3.2</version>
<configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration>
</plugin>
</plugins>
</build>
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override protected Class<?>[] getRootConfigClasses() { return new Class[]{RootConfig.class}; }
@Override protected Class<?>[] getServletConfigClasses() { return new Class[]{WebConfig.class}; }
@Override protected String[] getServletMappings() { return new String[]{"/"}; } // 映射根路徑
}
@Configuration
@EnableWebMvc
@ComponentScan("com.example.controller")
public class WebConfig implements WebMvcConfigurer {
@Bean public ViewResolver viewResolver() {
InternalResourceViewResolver r = new InternalResourceViewResolver();
r.setPrefix("/WEB-INF/views/"); r.setSuffix(".jsp"); return r;
}
@Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer c) { c.enable(); }
// 靜態資源映射(可選)
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}
}
@Configuration
@ComponentScan(basePackages = "com.example", excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = EnableWebMvc.class))
public class RootConfig { /* DataSource、Service、Repository 等 */ }
@Controller
public class HomeController {
@GetMapping("/")
public String home(Model model) {
model.addAttribute("message", "Hello Spring MVC Java Config!");
return "home"; // 對應 /WEB-INF/views/home.jsp
}
}
@Profile("dev") + @PropertySource 載入 application-dev.yml@ControllerAdvice + @ExceptionHandlerWebMvcConfigurer.addInterceptors()WebMvcConfigurer.addCorsMappings()maven-war-plugin 必須設 failOnMissingWebXml=false,否則打包報錯。ComponentScan 去重:RootConfig 掃描全包但排除 @EnableWebMvc,WebConfig 只掃 Controller,避免 Bean 重複註冊。configureDefaultServletHandling(configurer -> configurer.enable()) 轉發給容器默認 Servlet。純 Java 配置讓 Spring MVC 專案結構更清晰、維護成本更低。掌握 AbstractAnnotationConfigDispatcherServletInitializer 三個核心方法與 WebMvcConfigurer 擴展點,即可構建現代化、零 XML 的 Web 應用。