概述
本位我们将讨论标准 Spring 框架和 Spring Boot 之间的区别。
将重点讨论 Spring 的模块,如 MVC 和 Security,在 Spring 中使用时与 在Spring Boot 中使用时有何不同。
什么是 Spring
简而言之,Spring 框架为开发 Java 应用程序提供了全面的基础设施支持。它包含了一些不错的功能,如依赖注入,以及开箱即用的模块,如:
- jdbc
- mvc
- security
- aop
- orm
- ......
这些模块可以大大缩短应用程序的开发时间。
例如,在 Java Web 开发的早期,我们需要编写大量样板代码才能将记录插入数据源。通过使用 Spring JDBC 模块的 JDBCTemplate,我们可以将其简化为几行代码,只需少量配置即可。
什么是SpringBoot
Spring Boot 基本上是 Spring 框架的扩展,它消除了设置 Spring 应用程序所需的样板配置。它对 Spring 平台持固执己见的看法,这为更快、更高效的开发生态系统铺平了道路。以下是 Spring Boot 中的一些功能:
- 预置的依赖项,简化构建和应用程序配置
- 嵌入tomcat服务器
- 指标、运行监控和外部化配置
- 自动配置Spring功能
- ......
Maven依赖
首先,让我们看看使用 Spring 创建 Web 应用程序所需的最低依赖项:
<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.5</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.5</version>
</dependency>
与 Spring 不同,Spring Boot 只需要一个依赖项即可启动并运行 Web 应用程序:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.4.4</version>
</dependency>
在构建期间,所有其他依赖项都会自动添加到最终存档中。另一个很好的例子是测试库。我们通常使用 Spring Test、JUnit、Hamcrest 和 Mockito 库的集合。在 Spring 项目中,我们应该将所有这些库添加为依赖项。或者,在 Spring Boot 中,我们只需要用于测试的 starter 依赖项即可自动包含这些库。
Spring Boot 为不同的 Spring 模块提供了许多 Starter 依赖项。一些最常用的是:
- spring-boot-starter-data-jpa
- spring-boot-starter-security
- spring-boot-starter-test
- spring-boot-starter-web
- spring-boot-starter-thymeleaf
Mvc配置
让我们探索一下使用 Spring 和 Spring Boot 创建 JSP Web 应用程序所需的配置。Spring 需要定义调度程序 servlet、映射和其他支持配置。我们可以使用 web.xml 文件或 Initializer 类来做到这一点
public class MyWebAppInitializer implements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext container) {AnnotationConfigWebApplicationContext context= new AnnotationConfigWebApplicationContext();context.setConfigLocation("com.baeldung");container.addListener(new ContextLoaderListener(context));ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(context));dispatcher.setLoadOnStartup(1);dispatcher.addMapping("/");}
}
我们还需要将 @EnableWebMvc 注解添加到@Configuration类中,并定义一个视图解析器来解析从控制器返回的视图
@EnableWebMvc
@Configuration
public class ClientWebConfig implements WebMvcConfigurer { @Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver bean= new InternalResourceViewResolver();bean.setViewClass(JstlView.class);bean.setPrefix("/WEB-INF/view/");bean.setSuffix(".jsp");return bean;}
}
相比之下, Spring Boot 只需要几个属性即可在我们添加 Web 启动器后正常工作:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
通过称为 auto-configuration 的过程添加 Boot Web 启动器,会自动包含上述所有 Spring 配置。这意味着 Spring Boot 将查看应用程序中存在的依赖项、属性和 bean,并基于这些启用配置。
当然,如果我们想添加自己的自定义配置,那么 Spring Boot 自动配置将退出。
配置模板引擎
现在让我们学习如何在 Spring 和 Spring Boot 中配置 Thymeleaf 模板引擎。在 Spring 中,我们需要为视图解析器添加 thymeleaf-spring5 依赖项和一些配置:
@Configuration
@EnableWebMvc
public class MvcWebConfig implements WebMvcConfigurer {@Autowiredprivate ApplicationContext applicationContext;@Beanpublic SpringResourceTemplateResolver templateResolver() {SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();templateResolver.setApplicationContext(applicationContext);templateResolver.setPrefix("/WEB-INF/views/");templateResolver.setSuffix(".html");return templateResolver;}@Beanpublic SpringTemplateEngine templateEngine() {SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(templateResolver());templateEngine.setEnableSpringELCompiler(true);return templateEngine;}@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {ThymeleafViewResolver resolver = new ThymeleafViewResolver();resolver.setTemplateEngine(templateEngine());registry.viewResolver(resolver);}
}
Spring Boot 1 只需要spring-boot-starter-thymeleaf的依赖项即可在 Web 应用程序中启用 Thymeleaf 支持。由于 Thymeleaf3.0 中的新功能,我们还必须在 Spring Boot 2 Web 应用程序中添加 thymeleaf-layout-dialect 作为依赖项。或者,我们可以选择添加一个 spring-boot-starter-thymeleaf 依赖项,它将为我们处理所有这些。一旦依赖项就位,我们就可以将模板添加到 src/main/resources/templates 文件夹中,Spring Boot 将自动显示它们。
应用程序启动
Spring如何启动
Spring 既支持传统的 web.xml 引导方式,也支持最新的 Servlet 3+ 方法。
让我们逐步查看web.xml方法:
- Servlet 容器(服务器)读取 web.xml。
- web.xml中定义的 DispatcherServlet 由容器实例化。
- DispatcherServlet 通过读取 WEB-INF/{servletName}-servlet.xml来创建 WebApplicationContext。
- 最后,DispatcherServlet 注册在应用程序上下文中定义的 bean。
以下是 Spring 如何使用 Servlet 3+ 方法进行引导:
-
容器搜索实现 ServletContainerInitializer 的类并执行。
-
SpringServletContainerInitializer查找实现WebApplicationInitializer的所有类。
-
WebApplicationInitializer 使用 XML 或 @Configuration 类创建上下文。
-
WebApplicationInitializer 使用之前创建的上下文创建 DispatcherServlet。
SpringBoot如何启动
Spring Boot 应用程序的入口点是用 @SpringBootApplication 注释的类:
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
默认情况下, Spring Boot 使用嵌入式容器来运行应用程序。在这种情况下, Spring Boot 使用 public static void main 入口点来启动嵌入式 Web 服务器。它还负责将 Servlet、Filter 和 ServletContextInitializer bean 从应用程序上下文绑定到嵌入式 servlet 容器。Spring Boot 的另一个功能是它会自动扫描 Main-class 的同一包或子包中的所有类以查找组件。此外, Spring Boot 还提供了将其作为 Web 存档部署到外部容器中的选项。在这种情况下,我们必须扩展 SpringBootServletInitializer:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {// ...
}
在这里,外部 Servlet 容器查找在 Web 存档的 META-INF 文件中定义的 Main 类,而 SpringBootServletInitializer 将负责绑定 Servlet、Filter 和 ServletContextInitializer。
打包和部署
最后,让我们看看如何打包和部署应用程序。这两个框架都支持 Maven 和 Gradle 等常见的包管理技术;但是,在部署方面,这些框架差异很大。例如,Spring Boot Maven 插件在 Maven 中提供 Spring Boot 支持。它还允许打包可执行的 jar 或 war 存档,并 “就地” 运行应用程序。在部署上下文中,Spring Boot 相对于 Spring 的一些优势包括:
- 提供嵌入式容器支持使用
- 命令 java -jar 配置独立运行 jar
- 选择排除依赖项以避免在外部容器中部署时发生潜在 jar 冲突
- 部署时指定活动配置文件的选项
- 用于集成测试的随机端口生成
结论
在本文中,我们了解了 Spring 和 Spring Boot 之间的区别。简单来说,我们可以说 Spring Boot 只是 Spring 本身的扩展,让开发、测试和部署更加方便。