Spring和SpringBoot之间的区别

目录
  • Spring是什么?
  • Spring Boot是什么?
  • Maven依赖项
    • springboot为不同的Spring模块提供了许多启动程序依赖项。最常用的方法有:
  • MVC配置
    • 配置模板引擎
  • Spring Security 配置
    • Spring如何引导?
    • 如何启动Spring Boot?
  • 打包和部署
  • 结论

在本教程中,我们将研究标准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开发的早期,我们需要编写大量样板代码来将记录插入到数据源中。通过使用springjdbc模块的JDBCTemplate,我们可以用很少的配置将它简化为几行代码。

Spring Boot是什么?

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

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

以下是Spring Boot的一些功能:

  • 持约定优于配置的“starter”依赖关系,以简化构建和应用程序配置
  • 嵌入式服务器避免了应用程序部署的复杂性
  • 度量、运行状况检查和外部化配置
  • 自动配置-只要可能

让我们逐步熟悉这两个框架。

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项目中,我们应该添加所有这些库作为依赖项。

或者,在springboot中,我们只需要starter依赖项就可以自动包含这些库。

springboot为不同的Spring模块提供了许多启动程序依赖项。最常用的方法有:

  • spring-boot-starter-data-jpa
  • spring-boot-starter-security
  • spring-boot-starter-test
  • spring-boot-starter-web
  • spring-boot-starter-thymeleaf

要获得starters的完整列表,还可以查看Spring文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-starter

MVC配置

让我们研究一下使用Spring和SpringBoot创建jsp web应用程序所需的配置。

Spring需要定义dispatcherservlet、映射和其他支持配置。我们可以用web.xml文件或初始值设定项类:

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;
  }
}

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

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

通过一个名为auto-configuration的process添加bootwebstarter,上面所有的Spring配置都会自动包含进来。

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

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

配置模板引擎

现在让我们学习如何在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);
  }
}

SpringBoot只需要springbootstarter thymeleaf的依赖性就可以在web应用程序中启用thymeleaf支持。由于Thymeleaf3.0中的新特性,我们还必须在springboot2web应用程序中添加thymeleaf-layout-dialect作为依赖项。或者,我们可以选择添加一个springbootstarter和eleaf依赖,它将为我们处理所有这些。

一旦依赖项就位,我们就可以将模板添加到src/main/resources/templates文件夹中,Spring引导将自动显示它们。

Spring Security 配置

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

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

Spring需要标准的springsecurityweb和springsecurityconfig依赖项来设置应用程序中的安全性。

接下来,我们需要添加一个类来扩展WebSecurityConfigureAdapter并使用@EnableWebSecurity注释:

@Configuration
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
     .withUser("user1")
      .password(passwordEncoder()
      .encode("user1Pass"))
     .authorities("ROLE_USER");
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
     .anyRequest().authenticated()
     .and()
     .httpBasic();
  }

  @Bean
  public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
  }
}

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

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

springboot中的security安全配置与上面的相同。

要了解如何在Spring和Spring引导中实现JPA配置,我们可以查看我们的文章A Guide To JPA with Spring:https://www.baeldung.com/the-persistence-layer-with-spring-and-jpa

Application Bootstrap

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

另一方面,SpringBoot只使用Servlet3特性来引导应用程序。我们来详细谈谈。

Spring如何引导?

Spring既支持传统的web.xml引导方式以及最新的Servlet3+方法。

让我们看看web.xml分步进近:

1. Servlet容器(服务器)读取web.xml.

2.DispatcherServlet定义在web.xml中由容器实例化。

3. DispatcherServlet通过读取WEB-INF/{servletName}创建WebApplicationContext-servlet.xml.

4. 最后,DispatcherServlet注册在应用程序上下文中定义的bean。

下面是如何使用Servlet3+方法进行Spring引导:

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);
  }
}

默认情况下,springboot使用嵌入式容器来运行应用程序。在本例中,springboot使用public static void主入口点来启动嵌入式web服务器。

它还负责将Servlet、Filter和servletContextInitializerbean从应用程序上下文绑定到嵌入式Servlet容器。

springboot的另一个特性是,它自动扫描主类的同一个包或子包中的所有类中的组件。

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

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

在这里,外部servlet容器查找在web存档的META-INF文件中定义的主类,SpringBootServletInitializer将负责绑定servlet、过滤器和ServletContextInitializer。

打包和部署

最后,让我们看看如何打包和部署应用程序。这两个框架都支持Maven和Gradle等常见的包管理技术;但是,在部署方面,这些框架有很大的不同。

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

在部署环境中,Spring Boot优于Spring的一些优点包括:

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

结论

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

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

以上就是Spring和SpringBoot之间的区别的详细内容,更多关于Spring和SpringBoot区别的资料请关注我们其它相关文章!

(0)

相关推荐

  • Spring和SpringBoot有哪些区别

    概述 对于 Spring和 SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习 SpringBoot的我当时也是一头雾水,随着经验的积累.我慢慢理解了这两个框架到底有什么区别,相信对于用了 SpringBoot很久的同学来说,还不是很理解 SpringBoot到底和 Spring有什么区别,看完文章中的比较,或许你有了不同的答案和看法! 什么是Spring 作为 Java开发人员,大家都 Spring都不陌生,简而言之, Spring框架为开发 Java应用程序提供了全面的基础

  • Spring和SpringBoot比较及区别解惑

    1.概述: 对于 Spring 和 SpringBoot 到底有什么区别,我听到了很多答案,刚开始迈入学习 SpringBoot 的我当时也是一头雾水,随着经验的积累.我慢慢理解了这两个框架到底有什么区别,我相信对于用了 SpringBoot 很久的开发人员来说,有绝大部分还不是很理解 SpringBoot 到底和 Spring 有什么区别,看完文章中的比较,或许你有了不同的答案和看法! 2.什么是Spring呢? 先来聊一聊 Spring 作为 Java 开发人员,大家都 Spring 可不陌

  • Springboot @Validated和@Valid的区别及使用详解

    概述: @Valid是使用Hibernate validation的时候使用 @Validated是只用Spring Validator校验机制使用 说明:java的JSR303声明了@Valid这类接口,而Hibernate-validator对其进行了实现 @Validation对@Valid进行了二次封装,在使用上并没有区别,但在分组.注解位置.嵌套验证等功能上有所不同,这里主要就这几种情况进行说明. 注解位置: @Validated:用在类型.方法和方法参数上.但不能用于成员属性(fie

  • 深入浅析springboot中static和templates区别

    静态页面的return默认是跳转到/static/目录下,当在pom.xml中引入了thymeleaf组件,动态跳转会覆盖默认的静态跳转,默认就会跳转到/templates/下,注意看两者return代码也有区别,动态没有html后缀. 1.1 在static下新建hello1.html 运行程序,浏览器输入http://localhost:8080/hello1.html so,可以在根目录下访问hello1.html,static目录类似于传统Java web中的webroot或webcon

  • SpringBoot实现过滤器、拦截器与切片的实现和区别

    Q:使用过滤器.拦截器与切片实现每个请求耗时的统计,并比较三者的区别与联系 过滤器Filter 过滤器概念 Filter是J2E中来的,可以看做是 Servlet 的一种"加强版",它主要用于对用户请求进行预处理和后处理,拥有一个典型的 处理链 .Filter也可以对用户请求生成响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应.使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行预处理并生成响应,最后Filt

  • 详谈springboot过滤器和拦截器的实现及区别

    前言 springmvc中有两种很普遍的AOP实现: 1.过滤器(Filter) 2.拦截器(Interceptor) 本篇面对的是一些刚接触springboot的人群 所以主要讲解filter和interceptor的简单实现和它们之间到底有什么区别 (一些复杂的功能我会之后发出文章,请记得关注) Filter的简单实现 字面意思:过滤器就是过滤的作用,在web开发中过滤一些我们指定的url 那么它能帮我们过滤什么呢? 那功能可就多了: 比如过拦截掉我们不需要的接口请求 修改请求(reques

  • 浅谈SpringBoot项目打成war和jar的区别

    首先给大家来讲一个我们遇到的一个奇怪的问题: 1.我的一个springboot项目,用mvn install打包成jar,换一台有jdk的机器就直接可以用java -jar 项目名.jar的方式运行,没任何问题,为什么这里不需要tomcat也可以运行了? 2.然后我打包成war放进tomcat运行,发现端口号变成tomcat默认的8080(我在server.port中设置端口8090)项目名称也必须加上了. 也就是说我在原来的机器的IDEA中运行,项目接口地址为 ip:8090/listall,

  • 浅谈springboot内置tomcat和外部独立部署tomcat的区别

    前两天,我去面了个试,面试官问了我个问题,独立部署的tomcat跟springboot内置的tomcat有什么区别,为什么存在要禁掉springboot的tomcat然后将项目部署到独立的tomcat当中? 我就想,不都一个样?独立部署的tomcat可以配置优化?禁AJP,开多线程,开nio?而且springboot内置的tomcat多方便,部署上服务器写个java脚本运行即可.现在考虑下有什么条件能优于内置tomcat的. 1.tomcat的优化配置多线程?内置的也可以配置多线程 server

  • Springboot全局异常捕获及try catch区别解析

    今天在码代码的时候突然想到这个问题,觉得有点困惑.在网上也翻阅不少帖子其中有一个帖子给了我一个思路,其实也是解释了基础概念. 概念一:try catch 语句在try里面捕获到异常之后会进入catch子句内,执行catch内的代码. 概念二:springboot中的全局异常处理在捕获到异常之后,异常代码之后的语句是不会再运行了的 那么从我一开始思路理解开始,这个时候我觉得这2个的功能用处都是在代码出现异常情况的时候对其进行处理,且向调用者(或者就是用户)返回一个友好的提示,那这2个有啥区别呢,重

  • Spring和SpringBoot之间的区别

    目录 Spring是什么? Spring Boot是什么? Maven依赖项 springboot为不同的Spring模块提供了许多启动程序依赖项.最常用的方法有: MVC配置 配置模板引擎 Spring Security 配置 Spring如何引导? 如何启动Spring Boot? 打包和部署 结论 在本教程中,我们将研究标准Spring框架和Spring Boot之间的区别. 我们将重点讨论Spring的模块,如MVC和Security,在核心Spring中使用时与在Boot中使用时的区别

  • Java servlet、filter、listener、interceptor之间的区别和联系

    servlet.filter.listener.interceptor之间的区别和联系 一.概念 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层. 2.filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求.响应和头信息.Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应. 3.listener:

  • vue中计算属性(computed)、methods和watched之间的区别

    前言 本文主要给大家介绍了关于vue中计算属性(computed).methods和watched之间的区别,分享出来供大家参考学习,下面来一起看看详细的介绍: 计算属性 和普通属性一样是在模板中绑定计算属性的,当data中对应数据发生改变时,计算属性的值也会发生改变. Methods methods是方法,只要调用它,函数就会执行. 相同:两者达到的效果是同样的. 不同:计算属性是基于它们的依赖进行缓存的,只有相关依赖会发生改变时才会重新求职.只要相关依赖未改变,只会返回之前的结果,不再执行函

  • Servlet和Filter之间的区别与联系

    filter是一个可以复用的代码片段,可以用来转换HTTP请求.响应和头信息.Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应. 最近使用插装的时候,改用cookie对计算机进行识别,加入了过滤,仔细研究了一下servlet和filter,区别主要是: 过滤器的生命周期一般都要经过下面三个阶段: servlet的特点是: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Con

  • Java中List Set和Map之间的区别_动力节点Java学院整理

    Java集合的主要分为三种类型: • Set(集) • List(列表) • Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. 世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合 有人想有可以自动扩展的数组,所以有了List 有的

  • ExecuteReader(),ExecuteNonQuery(),ExecuteScalar(),ExecuteXmlReader()之间的区别

    ExecuteReader(),ExecuteNonQuery(),ExecuteScalar(),ExecuteXmlReader()之间的区别      主要有这么几种,cmd.ExecuteReader();cmd.ExecuteNonQuery();cmd.ExecuteScalar();cmd.ExecuteXmlReader();) 1,ExecuteReader();返回一个SqlDataReader对象或OleDbDataReader对象,这个看你的程序的需要去 做.可以通过这个

  • iOS的UIColor类与其相关类之间的区别及判断相等的方法

    UIColor,CGColor,CIColor三者的区别和联系   最近看了看CoreGraphics的东西,看到关于CGColor的东西,于是就想着顺便看看UIColor,CIColor,弄清楚它们之间的区别和联系.下面我们分别看看它们三个的概念:   一.UIColor   UIColor是UIKit中存储颜色信息的一个重要的类,一个UIColor对象包含了颜色和透明度的值,它的颜色空间已经针对IOS进行了优化.UIColor包含了一些类方法用于创建一些最常见的颜色,如白色,黑色,红色,透明

  • Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解

    简介 最近了解到很多网页开发者对jquery中的 .bind() .live() .delegate() 和 .on() 方法存在很多的疑惑.这些疑惑通常是关于它们之间真正的区别是什么啊,什么时候该使用它们啊.下面本文将给大家详细介绍这四个方法之间的区别,分别对每个方法都进行了详细的介绍,话不多说,来一起看看详细的介绍: 在我们深入了解这些方法之前,我们先来一段常见的的HTML,作为我们编写jquery示例方法使用的样本. <ul id="members" data-role=&

随机推荐