Spring与Spring Boot:深入理解两者之间的核心差异

本文详细比较了Spring和SpringBoot在模块化、部署流程、开发体验、社区支持以及配置简化等方面的特点,强调了SpringBoot在快速开发和简化配置上的优势,同时也讨论了两者各自的优缺点和进阶配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Spring和Spring Boot之间的区别

不仅仅体现在操作简化、配置方式以及开发速度上,还有以下几个方面:

  1. 模块化和功能范围
    • Spring是一个完整的框架,提供了各种各样的功能,包括依赖注入、面向切面编程、数据访问、事务管理、消息传递、Web开发等。它允许开发者根据需要选择和使用相应的模块。
    • Spring Boot则是一个基于Spring的框架,但它更专注于简化Spring应用的初始搭建和开发过程。Spring Boot提供了许多默认配置和工具,使得开发者可以快速构建和运行Spring应用,而无需进行大量的手动配置。
  2. 应用程序部署
    • 在Spring中,应用程序的部署可能涉及到复杂的配置和部署流程,需要开发者进行一系列的手动操作。
    • Spring Boot则大大简化了应用程序的部署过程。它提供了内嵌的Web服务器(如Tomcat、Jetty等),使得开发者可以直接打包应用为可执行的JAR或WAR文件,并通过简单的命令或插件进行部署,无需额外的服务器配置。
  3. 开发体验
    • Spring虽然功能强大,但由于其配置和管理的复杂性,对于新手来说可能存在一定的学习曲线。
    • Spring Boot则通过简化配置和提供自动化工具,大大提升了开发者的开发体验。它采用了“约定优于配置”的原则,减少了开发者需要手动进行配置的工作量,使得开发者能够更专注于业务逻辑的实现。
  4. 社区支持和生态系统
    • Spring作为Java领域最受欢迎的框架之一,拥有庞大的社区支持和丰富的生态系统。这意味着开发者可以轻松地找到解决方案、插件和扩展,以满足各种业务需求。
    • Spring Boot作为Spring家族的新成员,虽然相对较年轻,但也受到了广泛的关注和支持。随着其不断发展,其社区和生态系统也在逐渐壮大。
  5. 设计目的与简化程度
    • Spring是一个开放源代码的J2EE应用程序框架,它主要解决了开发者在J2EE开发中遇到的许多常见问题,并提供了功能强大的IOC、AOP及Web MVC等功能。然而,随着项目的增长和复杂性的增加,配置和管理Spring的各个模块可能会变得相当繁琐。
    • Spring Boot则是一个基于Spring框架的轻量级开发框架,旨在简化Spring应用的初始搭建和开发过程。它提供了极其快速和简化的操作,使Spring开发者能够快速上手。Spring Boot还提供了Spring运行的默认配置,并为通用Spring项目提供了许多非功能性特性。
  6. 配置与自动化
    • 在Spring中,配置可能涉及各种XML、JavaConfig等,处理起来可能相对繁琐。
    • Spring Boot则可以根据项目的依赖自动配置应用程序,从而大大减少了手动配置的工作量。
  7. 微服务支持
  • Spring Boot还提供了一些微服务相关的特性,如基于HTTP、REST、WebSocket的通信、服务发现和注册等,这在Spring中可能需要额外的配置和整合。

二、Spring和Spring Boot各有其优缺点

2.1、Spring的优点:

  1. 解耦与简化开发:Spring通过控制反转(IOC)和依赖注入(DI)实现了对象依赖之间的解耦,降低了业务对象替换的复杂性。这大大简化了开发过程,使得开发者可以更专注于业务逻辑的实现。
  2. AOP编程的支持:Spring提供了面向切面编程(AOP)的支持,可以方便地实现对程序进行权限拦截、运行监控等功能。
  3. 声明式事务的支持:Spring支持声明式事务管理,只需通过配置即可完成对事务的管理,无需手动编程。
  4. 易于集成与测试:Spring对各种优秀的开源框架提供了直接支持,如Struts、Hibernate、MyBatis等,方便集成。同时,Spring对Junit4也提供了良好的支持,可以方便地对Spring程序进行测试。

2.2、Spring的缺点:

  1. 配置复杂性:尽管Spring提供了丰富的功能,但其配置可能相对复杂,涉及各种XML、JavaConfig等。这可能会增加开发者的学习成本和维护难度。
  2. 性能影响:Spring使用了大量的反射机制,这可能会占用较多的内存,且效率不如直接调用高。
  3. 启动速度:随着Spring项目中使用的组件增多,其启动速度可能会受到影响。

2.3、Spring Boot的优点:

  1. 快速搭建项目:Spring Boot提供了许多自动化配置,能够快速构建项目,大大缩短了开发周期。
  2. 内嵌服务器:Spring Boot支持内嵌Tomcat、Jetty等服务器,方便开发者在开发阶段测试和调试应用。
  3. 易于维护:Spring Boot的项目结构清晰,代码规范,易于维护和扩展。
  4. 高度集成:Spring Boot集成了大量的第三方库,进一步简化了项目的开发过程。

2.4、Spring Boot的缺点:

  1. 启动时间:由于Spring Boot会自动配置大量组件,这可能会导致项目的启动时间较长。
  2. 默认配置限制:在一些特殊场景下,Spring Boot的默认配置可能与开发者的需求不符,这时需要进行大量的自定义配置。

三、Spring和Spring Boot比较进阶

3.1、Maven依赖

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

<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应用程序:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-web</artifactId> 
    <version>2.0.6.RELEASE</version> 
</dependency>

在 Spring 项目中,我们应该将Spring Test , JUnit , Hamcrest 和 Mockito添加为依赖项。但是在 Spring Boot中 ,我们只需要添加 spring-boot-starter-test 依赖项来自动包含这些库。 Spring Boot为不同的Spring模块提供了许多依赖项。一些最常用的是: spring-boot-starter-data-jpa spring-boot-starter-security spring-boot-starter-test spring-boot-starter-web spring-boot-starter-thymeleaf

3.2、MVC配置

在创建 Web 应用程序中Spring 需要定义调度程序 servlet ,映射和其他支持配置。我们可以使用 web.xml 文件或 Initializer 类来完成此操作:

public class MyWebAppInitializer implements WebApplicationInitializer { 
   
    @Override 
    public void onStartup(ServletContext container) { 
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
        context.setConfigLocation("com.pingfangushi"); 
          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相比,我们添加了 Web 启动程序, Spring Boot 只需要在 application 配置文件中配置几个属性来完成如上操作:

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

3.3、配置模板引擎

如何在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); 
    } 
} 

SpringBoot1X 只需要 spring-boot-starter-thymeleaf 的依赖 项 来启用 Web 应用程序中的 Thymeleaf 支持。但是由于 Thymeleaf3.0 中的新功能, 我们必须将 thymeleaf-layout-dialect 添加 为 SpringBoot2X Web应用程序中的依赖项。当依赖关系到位我们就可以将模板添加到说src/main/resources/templates 文件夹中, SpringBoot 将自动显示它们。

3.4、Spring Security 配置

Spring 首先需要依赖 spring-security-web 和 spring-security-config 模块。接下来, 我们需要添加一个扩展 WebSecurityConfigurerAdapter 的类,并使用 @EnableWebSecurity 注解:

@Configuration 
@EnableWebSecurity 
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { 
   
    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
        auth.inMemoryAuthentication() 
          .withUser("admin") 
            .password(passwordEncoder() 
            .encode("password")) 
          .authorities("ROLE_ADMIN"); 
    } 
   
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
        http.authorizeRequests() 
          .anyRequest().authenticated() 
          .and() 
          .httpBasic(); 
    } 
      
    @Bean 
    public PasswordEncoder passwordEncoder() { 
        return new BCryptPasswordEncoder(); 
    } 
} 

这里我们使用 inMemoryAuthentication 来设置身份验证。同样, Spring Boot 也需要这些依赖项才能使其工作。但是我们只需要定义 spring-boot-starter-security 的依赖关系,因为这会自动将所有相关的依赖项添加到类路径中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yaml墨韵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值