Spring(Spring/Springboot 的创建) 基础

简介: Spring(Spring/Springboot 的创建) 基础

一. Spring

1.1 Spring是什么?

Spring 指的是 Spring Frameword(Spring 框架),它是一个开源框架。

Spring 是包含了众多工具方法的IoC容器。

1.2 什么是容器?

容器时用来容纳某种物品的装置。

我们之前接触到的容器:

List/Map -> 数据存储容器

Tomcat-> Web 容器

1.3 什么是IoC?

IoC(Inversion of Control) 翻译成中文是“控制反转”的意思,也就是说spring 是一个“控制反转”的容器。

在日常代码中,我们通常通过new来构造对象,而这个对象的生命周期由程序员和代码片段控制。但IoC则是不需要程序员来new 对象了,在IoC加载时,放入IoC的对象也会加载,当我们需要这个对象了,直接从容器中取就行了,不需要再new了。

1.4 IoC 代码解释

在我们传统代码中,构建一辆车(Car),然而车需要依赖车身(FrameWork),而车身要依赖地盘(Bottom),而地盘需要依赖(Tire)。代码实现如下:

//车
public class Car {
    private FrameWork frameWork;
    public Car(){
        this.frameWork=new FrameWork();
    }
 
    public void init(){
        System.out.println("Car Init");
        this.frameWork.init();
    }
}
 
//车身
public class FrameWork {
    private Bottom bottom;
    public FrameWork(){
        this.bottom=new Bottom();
    }
    public void init(){
        System.out.println("FrameWork Init");
        this.bottom.init();
    }
}
 
//底盘
public class Bottom {
    Tire tire=null;
    public  Bottom(){
        this.tire=new Tire();
    }
    public void init(){
        System.out.println("Bottom Init");
        tire.init();
    }
}
 
//车轮
public class Tire {
    int size=15;
    public Tire(){
       
    }
    public void init(){
        System.out.println("Tire Init,Size:"+size);
    }
}
 
public class Test {
    public static void main(String[] args) {
        Car car=new Car();
        car.init();
    }
}

但是随着对车的需求量增大,对车的个性化也会越来越多,比如需要不同尺寸的轮胎,那这个时候就需要我们加工多种尺寸的轮胎,此时就需要对上述代码进行修改。修改后的代码如下所示:

//车
public class Car {
    private FrameWork frameWork;
    public Car(int size){
        this.frameWork=new FrameWork(size);
    }
 
    public void init(){
        System.out.println("Car Init");
        this.frameWork.init();
    }
}
 
//车身
public class FrameWork {
    private Bottom bottom;
    public FrameWork(int size){
        this.bottom=new spring.old.Bottom(size);
    }
    public void init(){
        System.out.println("FrameWork Init");
        this.bottom.init();
    }
}
 
//底盘
public class Bottom {
    Tire tire=null;
    public Bottom(int size){
        this.tire=new spring.old.Tire(size);
    }
    public void init(){
        System.out.println("Bottom Init");
        this.tire.init();
    }
}
 
//车轮
public class Tire {
    int size=15;
    public Tire(int size){
        this.size=size;
    }
    public void init(){
        System.out.println("Tire Init,Size:"+size);
    }
}
 
public class Test {
    public static void main(String[] args) {
        Car car=new Car();
        car.init();
    }
}

从以上代码可以看出,若是最低层的代码改动之后,这个调用链上的所有代码都需要修改。

为了解决上述问题,实现解耦,通过控制反转进行程序开发:

//车
public class Car {
    FrameWork frameWork=null;
    public Car(FrameWork frameWork){
        this.frameWork=frameWork;
    }
    public void init(){
        System.out.println("Car Init");
        frameWork.init();
    }
}
 
//车身
public class FrameWork {
    Bottom bottom=null;
    public FrameWork(Bottom bottom){
        this.bottom=bottom;
    }
    public void init(){
        System.out.println("FrameWork Init");
        bottom.init();
    }
}
 
//地盘
public class Bottom {
    Tire tire=null;
    public  Bottom(Tire tire){
        this.tire=tire;
    }
    public void init(){
        System.out.println("Bottom Init");
        tire.init();
    }
}
 
//车轮
public class Tire {
    int size=15;
    public Tire(int size){
        this.size=size;
    }
    public void init(){
        System.out.println("Tire Init,Size:"+size);
    }
}
 
/*
* 模拟IoC
*/
public class Test {
    private Car car;
    private FrameWork frameWork;
    private Bottom bottom;
    private Tire tire;
    public Test(){
//如果Tire有新的属性或参数,不需要修改上级对象,只需要在IoC中添加或修改相应的构造对象的参数
//而上述代码的实现就相当于我们平常实现的业务逻辑,这个Test就相当于Spring
//我们不需要担心对象的创建,那是由Spring控制的,而Spring可以根据我们提供的参数来匹配创建什么样的对象
        this.tire=new Tire(12);
        this.bottom=new Bottom(this.tire);
        this.frameWork=new FrameWork(this.bottom);
        this.car=new Car(this.frameWork);
    }
    public static void main(String[] args) {
        Test test=new Test();
        test.car.init();
    }
}

通过上述代码我们能发现一个规律:


通过应用程序的实现代码,类的创建顺序是反的,传统代码是Car控制并创建了FrameWork,FraemWork控制并创建了Bottom,依次往下,而改进之后的控制权发生的反转,不再是上级对象创建并控制下级对象了,而是把下级对象注入到当前对象中,下级的控制权不再由上级控制了,这样即使下级类发生任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是IoC思想

二. Spring 的创建

2.1 创建一个Maven 项目

2.2 添加Spring 框架支持

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.28</version>
        </dependency>
 
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.3.28</version>
        </dependency>
 
    </dependencies>

在resources下创建配置文件,以下内容为固定格式(但是文件名字可以随意命名)

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

三. SpringBoot 的创建

Idea 的社区版安装Spring Boot Helper 才能创建SpringBoot项目(旗舰版是不需要安装这个插件的),社区办的idea 不能使用2021.3之后的版本(之后的版本的Spring Boot Helper 插件需要通行证,只能使用一个月).


创建SpringBoot 项目,现在只支持jdk17,jdk21

3.1 创建 SpringBoot 项目

在里面勾选maven并点击ok,会自动生成一个pom.xml文件

这里可能会出现报错,因为我所配置的国内源中没有这个版本,直接将.RELEASE删掉,重新reload一下就好了.

3.2 配置国内源

如果不配置就会导致Spring/Spring Boot 失败,或者是在maven项目中引入jar失败.

因为idea 有两份配置文件,如下图所示,所以再进行后续的配置中,要设置两次,分别给当前的项目和新项目中都进行相应的配置(只针对第一次创建Spring Boot)

上述两个路径不要带中文

若是有settings.xml文件将以下复制到<mirrors></mirrors>中,若是没有,可去自行下载:

   <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>        
      </mirror>

settings.xml

将本地的方法库删除,重新加载maven jar包

删除后重新加载

<!--    <dependency>-->
<!--      <groupId>org.springframework.boot</groupId>-->
<!--      <artifactId>spring-boot-starter</artifactId>-->
<!--    </dependency>-->
 
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

pom.xml中的是上述的一个,我们需要使用第二个把第一个依赖替换掉

运行出现以下内容说明创建成功了:

相关文章
|
1月前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
43 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
1月前
|
监控 Java 应用服务中间件
Spring和Spring Boot的区别
Spring和Spring Boot的主要区别,包括项目配置、开发模式、项目依赖、内嵌服务器和监控管理等方面,强调Spring Boot基于Spring框架,通过约定优于配置、自动配置和快速启动器等特性,简化了Spring应用的开发和部署过程。
51 19
|
1月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
56 2
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
88 1
|
1月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
25 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
1月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
23 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
1月前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
46 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
|
1月前
|
SQL Java 数据库
Springboot+spring-boot-starter-data-jdbc实现数据库的操作
本文介绍了如何使用Spring Boot的spring-boot-starter-data-jdbc依赖来操作数据库,包括添加依赖、配置数据库信息和编写基于JdbcTemplate的数据访问代码。
47 2
|
1月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
167 2
|
1月前
|
前端开发 安全 Java
【Spring】Spring Boot项目创建和目录介绍
【Spring】Spring Boot项目创建和目录介绍
84 2