【框架】Spring、SpringBoot和SpringCloud区别

Spring

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)

IoC(Inversion of Control,控制反转)是一种设计思想,它主要用于降低软件系统中不同模块之间的耦合度,提高代码的可维护性和可扩展性。

一、传统开发与 IoC 开发的对比

在传统的软件设计中,对象的创建和依赖关系的管理通常由对象自身负责。例如,一个对象 A 需要依赖对象 B 来完成某些功能,那么对象 A 就会在自己的代码中显式地创建对象 B。这样的方式会导致对象之间的耦合度较高,当对象 B 的实现发生变化时,可能需要修改对象 A 的代码。

而在 IoC 的设计模式下,对象的创建和依赖关系的注入由一个外部的容器(通常称为 IoC 容器)来负责。对象只需要声明自己所需要的依赖,而不需要关心这些依赖是如何创建和管理的。当对象需要使用依赖时,IoC 容器会自动将依赖注入到对象中。

二、IoC 的实现方式

  • 依赖注入(Dependency Injection,DI):这是实现 IoC 的主要方式之一。依赖注入是指在对象创建的时候,由 IoC 容器将对象所需要的依赖传递给它。依赖注入可以通过构造函数注入、Setter 方法注入和接口注入等方式实现。
  • 构造函数注入:在对象创建时,通过构造函数将依赖传递给对象。这种方式可以确保对象在创建时就拥有所需的依赖,并且可以保证依赖的不可变性。
  • Setter 方法注入:在对象创建后,通过 Setter 方法将依赖传递给对象。这种方式比较灵活,可以在对象创建后动态地设置依赖。

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想,它通过在不修改原有业务逻辑代码的情况下,对业务逻辑的各个部分进行增强或补充,从而实现横切关注点的分离。

一、AOP 的核心概念

  • 切面(Aspect):切面是对横切关注点的模块化封装,它包含了对业务逻辑的增强或补充的代码。例如,日志记录、事务管理、安全检查等都可以作为切面。
  • 连接点(Join Point):连接点是程序执行过程中的一个特定点,例如方法调用、方法执行、异常抛出等。在 AOP 中,连接点是切面可以插入的地方。
  • 切入点(Pointcut):切入点是对连接点的筛选条件,它定义了哪些连接点可以被切面增强。通过定义切入点,可以精确地控制切面的作用范围。
  • 通知(Advice):通知是在切入点处执行的代码,它可以在连接点之前、之后或周围执行。通知分为前置通知(Before Advice)、后置通知(After Advice)、环绕通知(Around Advice)等类型。

SpringBoot

SpringBoot是为了简化Spring开发的框架(具体体现就是说Spring创建一个代码需要配置对应的Bean和MVC(xml文件)但是SpringBoot无需配置)主要的一个特点就是约定大于配置(就我们上面说的Spring需要配置一些信息,但是SpringBoot就不需要)

自动配置

  • Spring Boot 在启动时会自动扫描类路径下的依赖和配置,并根据这些信息进行自动配置。

  • 自动配置的原理 :自动配置主要是归功于@SpringBootApplication这个注解,由@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan

    这三个注解组成的,其中 @EnableAutoConfiguration 是实现自动化配置的核心注解。该注解主要是通过 @Import 注解导入对应的配置选择器。关键是内部读取该项目和 该项目引入的Jar包 里的classpath路径下的** META-INF/spring.factories **文件中的所配置类的全类名。这些配置类中所定义的Bean还会根据对应的条件注解 @CoditionalOnClass 这个注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。

约定大于配置

SpringBoot是为了简化Spring开发的框架(具体体现就是说Spring创建一个代码需要配置对应的Bean和MVC(xml文件)但是SpringBoot无需配置)主要的一个特点就是约定大于配置(就我们上面说的Spring需要配置一些信息,但是SpringBoot就不需要)

代码示例:

SpringBoot实现

复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

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

    @GetMapping("/hello")
    public String hello() {
        return "Hello, Spring Boot!";
    }
}

Spring代码实现:

复制代码
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloWorldController {

    @RequestMapping("/hello")
    @ResponseBody
    public String hello() {
        return "Hello, Spring!";
    }

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}

同时,你需要创建一个名为 applicationContext.xml 的配置文件,内容如下:

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="你的包名"/>

    <mvc:annotation-driven/>
</beans>

SpringCloud

Spring Cloud 是一个基于 Spring Boot 的微服务开发框架,它提供了一系列工具和组件,帮助开发人员快速构建分布式系统。

一、主要特点

相关推荐
Mryan20058 小时前
解决GraalVM Native Maven Plugin错误:JAVA_HOME未指向GraalVM Distribution
java·开发语言·spring boot·maven
VX_CXsjNo18 小时前
免费送源码:Java+SSM+Android Studio 基于Android Studio游戏搜索app的设计与实现 计算机毕业设计原创定制
java·spring boot·spring·游戏·eclipse·android studio·android-studio
小小鸭程序员8 小时前
Vue组件化开发深度解析:Element UI与Ant Design Vue对比实践
java·vue.js·spring·ui·elementui
陌路物是人非9 小时前
SpringBoot + Netty + Vue + WebSocket实现在线聊天
vue.js·spring boot·websocket·netty
穿林鸟11 小时前
Spring Boot项目信创国产化适配指南
java·spring boot·后端
伏游11 小时前
【BUG】生产环境死锁问题定位排查解决全过程
服务器·数据库·spring boot·后端·postgresql·bug
hycccccch11 小时前
Springcache+xxljob实现定时刷新缓存
java·后端·spring·缓存
爱的叹息12 小时前
SpringBoot集成Redis 灵活使用 TypedTuple 和 DefaultTypedTuple 实现 Redis ZSet 的复杂操作
spring boot·redis·bootstrap
wisdom_zhe12 小时前
Spring Boot 日志 配置 SLF4J 和 Logback
java·spring boot·logback
揣晓丹12 小时前
JAVA实战开源项目:校园失物招领系统(Vue+SpringBoot) 附源码
java·开发语言·vue.js·spring boot·开源