Spring Boot 教程2:Spring 与 Spring Boot 的比较

Spring Boot 教程2:Spring 与 Spring Boot 的比较

声明

这个系列文章是翻译自https://www.baeldung.com/的系列博客,个人感觉是一个非常不错的Spring Boot 教程。原网站属于一个公司,主要开展有偿培训业务,但提供相关文字教程的免费阅读和下载。因为我并没有在网页找到相关版权描述信息,所以并不能确定是否可以自由翻译和转载,如果有版权问题,请联系我,我会撤下这个系列文章。

原文地址:A Comparison Between Spring and Spring Boot | Baeldung

因为版权的关系,本文禁止转载。


概述

在本教程中,我们将研究标准Spring框架和Spring Boot之间的差异。

我们将关注并讨论Spring的模块,如MVC和Security,在核心Spring中使用时与在Boot中使用时有何不同。

什么是 Spring?

简单地说,Spring框架为开发Java应用程序提供了全面的基础设施支持。

它包含了一些很好的功能,比如依赖注入,以及开箱即用的模块,比如:

  • Spring JDBC

  • Spring MVC

  • Spring Security

  • Spring AOP

  • Spring ORM

  • Spring Test

这些模块可以大大减少应用程序的开发时间。

例如,在Java Web开发的早期,我们需要编写大量样板代码来将记录插入数据源。通过使用Spring JDBC模块的JDBCTemplate,我们可以将其减少到几行代码,只需要几个配置。

什么是 Spring Boot?

Spring Boot基本上是Spring框架的扩展,它消除了设置Spring应用程序所需的样板配置。

它对Spring平台采取了固执己见的观点,这为更快,更高效的开发生态系统铺平了道路

以下是Spring Boot中的一些功能:

  • 自定义的“启动器”依赖项,以简化构建和应用程序配置
  • 嵌入式服务器,避免应用程序部署的复杂性
  • 指标、运行状况检查和外部化配置
  • 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

要获得启动器的完整列表,还可以查看Spring文档

MVC 配置

让我们探索使用Spring和Spring Boot创建JSP Web应用程序所需的配置。

Spring需要定义dispatcher servlet、映射和其他支持配置。我们可以使用web.xml文件或Initializer类来实现:

public class MyWebAppInitializer implements WebApplicationInitializer {
 
    @Override
    public 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 { 
   @Bean
   public ViewResolver viewResolver() {
      InternalResourceViewResolver bean
        = new InternalResourceViewResolver();
      bean.setViewClass(JstlView.class);
      bean.setPrefix("/WEB-INF/view/");
      bean.setSuffix(".jsp");
      return bean;
   }
}

相比之下,Spring Boot只需要几个属性就可以在我们添加web starter后工作:

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

上面的所有Spring配置都是通过一个称为自动配置的过程添加 Boot web starter 来自动包含的。

这意味着Spring Boot将查看应用程序中存在的依赖项,属性和bean,并基于这些启用配置。

当然,如果我们想添加自己的自定义配置,那么Spring Boot自动配置将退出。

配置模版引擎

现在让我们学习如何在Spring和Spring Boot中配置Thymeleaf模板引擎。

在Spring中,我们需要添加 thymeleaf-spring5 依赖和一些视图解析器的配置:

@Configuration
@EnableWebMvc
public class MvcWebConfig implements WebMvcConfigurer {

    @Autowired
    private ApplicationContext applicationContext;

    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver = 
          new SpringResourceTemplateResolver();
        templateResolver.setApplicationContext(applicationContext);
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        return templateResolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setEnableSpringELCompiler(true);
        return templateEngine;
    }

    @Override
    public 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 安全配置

为了简单起见,我们将看到如何使用这些框架启用默认的HTTP Basic身份验证。

让我们首先看看使用Spring启用安全性所需的依赖项和配置。

Spring需要标准的 spring-security-web 和 spring-security-config 依赖项来在应用程序中设置Security。

接下来,我们需要添加一个类来创建SecurityFilterChain bean并使用@EnableWebSecurity注释:

@Configuration
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter {
 
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
          .withUser("user1")
            .password(passwordEncoder()
            .encode("user1Pass"))
          .authorities("ROLE_USER");
    }
 
    @Bean
     public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeRequests()
          .anyRequest().authenticated()
          .and()
          .httpBasic();
        return http.build();
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

这里我们使用inMemoryAuthentication来设置身份验证。

Spring Boot 也需要这些依赖项才能工作,但我们只需要定义 spring-boot-starter-security 的依赖项,因为这将自动将所有相关依赖项添加到classpath。

Spring Boot 中的安全配置与上面的相同。

要了解如何在Spring和Spring靴子中实现JPA配置,我们可以查看我们的文章 A Guide to JPA with Spring

应用程序引导程序

在Spring和Spring Boot中引导应用程序的基本区别在于servlet。Spring使用 web.xmlSpringServletContainerInitializer 作为其引导入口点。

另一方面,Spring Boot 仅使用Servlet 3功能来引导应用程序。我们来详细谈谈这个问题。

Spring Bootstrap 是什么?

Spring 既支持传统的 web.xml 引导方式,也支持最新的Servlet 3+方法。

让我们来看看 web.xml 方式的步骤:

  1. Servlet容器(服务器)读取 web.xml
  2. 在web.xml中定义的 DispatcherServlet 由容器实例化。
  3. DispatcherServlet 通过阅读 WEB-INF/{servletName}-servlet.xml 创建 WebApplicationContext
  4. 最后,DispatcherServlet 注册在应用程序上下文中定义的bean。

以下是Spring如何使用Servlet 3+方法进行引导:

  1. 容器搜索实现 ServletContainerInitializer 的类并执行。
  2. SpringServletContainerInitializer 查找实现 WebApplicationInitializer 的所有类。
  3. WebApplicationInitializer 使用XML或 @Configuration 类创建上下文。
  4. WebApplicationInitializer 使用先前创建的上下文创建 DispatcherServlet

Spring Boot 如何启动?

Spring Boot 应用程序的入口点是使用 @SpringBootApplication 注释的类:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

默认情况下,Spring Boot 使用嵌入式容器来运行应用程序。在这种情况下,Spring靴子使用 public static void main 入口点来启动嵌入式Web服务器。

它还负责将 ServletFilterServletContextInitializer bean 从应用程序上下文绑定到嵌入式servlet容器。

Spring Boot 的另一个特性是它会自动扫描 Main-class 的同一个包或子包中的所有类。

此外,Spring Boot 还提供了将其部署为外部容器中的Web存档的选项。在这种情况下,我们必须扩展SpringBootServletInitializer

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    // ...
}

在这里,外部servlet容器查找Web存档的META-INF文件中定义的 Main-class,SpringBootServletInitializer将负责绑定 ServletFilterServletContextInitializer

打包和部署

最后,让我们看看如何打包和部署应用程序。这两个框架都支持常见的包管理技术,如Maven和Gradle;然而,当涉及到部署时,这些框架有很大的不同。

例如,Spring Boot Maven 插件在Maven中提供Spring Boot支持。它还允许打包可执行的jar或war归档文件,并“就地”运行应用程序。

Spring Boot 在部署上下文中的一些优势包括:

  • 提供嵌入式容器支持
  • 使用命令 java -jar 独立运行 jar
  • (通过)选项来排除依赖项,以避免在外部容器中部署时发生潜在的JAR冲突
  • 用于在部署时指定活动配置文件的选项
  • 用于集成测试的随机端口生成

结论

在本文中,我们了解了Spring和Spring Boot 之间的差异。

简而言之,我们可以说Spring Boot 只是Spring本身的扩展,使开发,测试和部署更加方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值