一. 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中的是上述的一個,我們需要使用第二個把第一個依賴替換掉
運行出現以下內容說明創建成功了: