Spring和spring Boot的区别

一、Spring的介绍

简而言之,Spring框架为开发Java应用程序提供了全面的基础架构支持。它包含一些很好的功能,如依赖注入和开箱即用的模块,如:

  1. Spring JDBC
  2. Spring MVC
  3. Spring Security
  4. Spring AOP
  5. Spring ORM
  6. Spring Test

这些模块可以大大缩短应用程序的开发时间。例如,在Java Web开发的早期阶段,我们需要编写大量的重复代码来将记录插入到数据源中。但是通过使用Spring JDBC模块的JDBCTemplate,我们可以将它简化为只需几个简单配置或者几行代码。

二、SpringBoot的介绍

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

它的目标和Spring的目标是一致的,为更快,更高效的开发生态系统铺平了道路。以下是Spring Boot中的一些功能:

  1. 通过starter这一个依赖,以简化构建和复杂的应用程序配置。
  2. 可以直接main函数启动,嵌入式web服务器,避免了应用程序部署的复杂性,Metrics度量,Helth check健康检查和外部化配置。
  3. 尽可能的自动化配置Spring功能。

三、Spring与SpringBoot的比较

3.1 Maven依赖

首先,让我们看一下使用Spring创建Web应用程序所需的最小依赖项:

XML 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.1.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.0.RELEASE</version>
</dependency>

与Spring不同,Spring Boot只需要一个依赖项来启动和运行Web应用程序:

XML 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.0.5.RELEASE</version>
</dependency>

在构建期间,所有其他依赖项将自动添加到最终归档中。

Spring Boot为不同的Spring模块提供了许多入门依赖项。一些最常用的是:

  1. spring-boot-starter-data-jpa
  2. spring-boot-starter-security
  3. spring-boot-starter-test
  4. spring-boot-starter-web
  5. spring-boot-starter-thymeleaf

3.2 MVC配置

下面来探讨一下使用Spring和Spring Boot创建JSP Web应用程序所需的配置。

java 复制代码
public class MyWebAppInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext container) {
    AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
    context.setConfigLocation("com.test.package");

    container.addListener(new ContextLoaderListener(context));

    ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(context));

    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/");
}


@Override
public void onStartup(ServletContext container) {
    AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
    context.setConfigLocation("com.test.package");

    container.addListener(new ContextLoaderListener(context));

    ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(context));

    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/");
}
}

我们还需要将@EnableWebMvc注解添加到@Configuration注解类,并定义一个视图解析器来解析从控制器返回的视图:

java 复制代码
@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 Boot只需要一些属性来使上面的事情正常工作:

java 复制代码
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

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

这意味着Spring Boot将自动扫描应用程序中存在的依赖项,属性和bean,并根据这些内容启用相应的配置。

3.3 模板引擎配置

再来看看如何在Spring和Spring Boot中配置Thymeleaf模板引擎,两者有啥区别?

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

java 复制代码
@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);
}


@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 只需要spring-boot-starter-thymeleaf的依赖项 来启用Web应用程序中的Thymeleaf支持。

一旦依赖关系添加成功后,我们就可以将模板添加到src / main / resources / templates文件夹中,Spring Boot将自动显示它们。

3.4 安全配置

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

让我们首先看一下使用Spring启用Security所需的依赖关系和配置。

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

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

java 复制代码
@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();
}


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

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

3.5 应用引导Application Bootstrap

Spring和Spring Boot中应用程序引导的基本区别在于servlet。

Spring使用web.xml 或SpringServletContainerInitializer 作为其引导入口点。

spring boot仅仅使用Servlet 3来引导程序。

首先来说说spring引导

方法一:web.xml引导方法

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

方法二:servlet 3+引导方法

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

再来说说Spring Boot引导

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

java 复制代码
@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类的子包中的组件。

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

java 复制代码
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    // ...
}

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

3.6 打包和部署

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

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

与spring相比,在部署环境中Spring Boot的一些优点包括

  1. 提供嵌入式容器支持
  2. 使用命令java -jar独立运行jar
  3. 在外部容器中部署时,可以选择排除依赖关系以避免潜在的jar冲突
  4. 部署时灵活指定配置文件的选项
  5. 用于集成测试的随机端口生成

四、总结:

综上所述:Spring Boot只是Spring本身的扩展,使开发,测试和部署更加方便。

相关推荐
用户2986985301419 分钟前
.NET 文档自动化:Spire.Doc 设置奇偶页页眉/页脚的最佳实践
后端·c#·.net
码路飞1 小时前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript
序安InToo1 小时前
第6课|注释与代码风格
后端·操作系统·嵌入式
xyy1231 小时前
C#: Newtonsoft.Json 到 System.Text.Json 迁移避坑指南
后端
洋洋技术笔记1 小时前
Spring Boot Web MVC配置详解
spring boot·后端
JxWang051 小时前
VS Code 配置 Markdown 环境
后端
navms1 小时前
搞懂线程池,先把 Worker 机制啃明白
后端
JxWang051 小时前
离线数仓的优化及重构
后端
Nyarlathotep01131 小时前
gin01:初探gin的启动
后端·go
JxWang051 小时前
安卓手机配置通用多屏协同及自动化脚本
后端