Spring 和 Spring Boot 比较

本文对比了Spring和Spring Boot的区别,Spring提供全面的Java应用基础架构支持,包括依赖注入和模块如JDBC、MVC等。Spring Boot是Spring的扩展,减少配置,提供starter依赖简化构建,内置嵌入式服务器。它自动配置Spring功能,简化测试、MVC配置、Thymeleaf模板引擎、Spring Security的设置,并提供了独立运行的jar包支持。

1.什么是Spring

Spring框架为开发Java应用提供了全面的基础架构支持。
它包含一些不错的功能,如依赖注入,以及开箱即用的模块,如:

Spring JDBC
Spring MVC
Spring Security
Spring AOP
Spring ORM
Spring Test

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

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

2.什么是Spring Boot

Spring Boot 基本上是 Spring 框架的扩展,它消除了设置 Spring 应用进程所需的样板配置。
它对Spring平台持固执己见的观点,这为更快,更高效的开发生态系统铺平了道路。
以下是Spring Boot中的一些功能:

固执己见的“starter”依赖项,可简化构建和应用进程配置
嵌入式服务器,避免应用进程部署的复杂性
指标、运行状况检查和外部化配置
自动配置 Spring 功能 – 尽可能

3.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

4.MVC 配置

Spring 和 Spring 引导创建 JSP Web 应用进程所需的配置。
Spring 需要定义dispatcher servlet, mappings以及其他的一些配置。
我们可以使用 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 启动器后使事情正常工作。

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

通过称为自动配置的过程添加启动Web启动器,自动包含上述所有Spring配置。
这意味着 Spring Boot 将查看应用进程中存在的依赖项、属性和 bean,并基于这些启用配置。

4.1 配置模板引擎

如何在Spring和SpringBoot中配置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将自动显示它们。

5.Spring Security 配置

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 来设置authentication(身份验证)。

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

Spring Boot中的security配置与上述配置相同。

6.加载应用程序

在 Spring 和 Spring Boot中加载应用进程的基本区别在于 servlet。
Spring 使用 web.xml 或 SpringServletContainerInitializer 作为其加载入口。
而Spring Boot 仅使用 Servlet 3 功能来加载应用进程。

6.1Spring如何加载

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

分步查看 web.xml 方法:

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

以下是Spring使用Servlet 3+方法加载的方式:

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

6.2 Spring Boot 如何加载

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 的另一个功能是它会自动扫描同一包或主类的子包中的所有类以查找组件。
此外,Spring Boot 还提供了将其部署为外部容器中的 Web 存档的选项。在这种情况下,我们必须扩展 SpringBootServletInitializer:

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

在这里,外部 servlet 容器查找在 Web 存档的 META-INF 文档中定义的 Main-class,SpringBootServletInitializer 将负责绑定 Servlet、Filter 和 ServletContextInitializer。

7.打包和部署

这两个框架都支持常见的包 管理技术,如 Maven 和 Gradle;但是,在部署方面,这些框架差异很大。
例如,Spring Boot Maven 插件在 Maven 中提供了 Spring Boot 支持。它还允许打包可执行的jar或war文件,并“就地”运行应用进程。
在部署环境中,Spring Boot 相对于 Spring 的一些优势包括:

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

8.结论

简单来说,Spring Boot就是对Spring本身的扩展,让开发、测试、部署更加方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值