一. 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>
将本地的方法库删除,重新加载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中的是上述的一个,我们需要使用第二个把第一个依赖替换掉
运行出现以下内容说明创建成功了: