一、Spring概述
1. Spring是什麼?
Spring 的主要作用就是為程式碼“解耦”,降低程式碼間的耦合度。就是讓物件和物件(模組和模組)之間關係不是使用程式碼關聯,而是通過配置來說明。即在 Spring 中說明物件(模組)的關係
Spring 根據程式碼的功能特點,使用 IOC 降低業務物件之間耦合度。IOC 使得主業務在相互呼叫過程中,不用再自己維護關係了,即不用再自己建立要使用的物件了。而是由 Spring容器統一管理,自動“注入”,注入即賦值。 而 AOP 使得系統級服務得到了最大複用,且不用再由程式設計師手工將系統級服務“混雜”到主業務邏輯中了,而是由 Spring 容器統一完成“織入”
spring全家桶:
spring , springmvc ,spring boot , spring cloud
spring: 出現是在2002左右,解決企業開發的難度。減輕對專案模組之間的管理,類和類之間的管理, 幫助開發人員建立物件,管理物件之間的關係。
spring核心技術 ioc(控制反轉) , aop(面向切面程式設計) 。能實現模組之間,類之間的解耦合。
2. IOC控制反轉
控制反轉(IOC,Inversion of Control),是一個概念,是一種思想。指將傳統上由程式程式碼直接操控的物件呼叫權交給容器,通過容器來實現物件的裝配和管理,控制反轉就是對物件控制權的轉移,從程式程式碼本身反轉到了外部容器。
通過容器實現物件的建立,屬性賦值,依賴的管理。
IoC 是一個概念,是一種思想,其實現方式多種多樣。當前比較流行的實現方式是依賴注入
依賴:classA 類中含有 classB 的例項,在 classA 中呼叫 classB 的方法完成功能,即 classA對 classB 有依賴
IOC的實現:
依賴注入:DI(Dependency Injection),程式程式碼不做定位查詢,這些工作由容器自行完成
依賴注入 DI 是指程式執行過程中,若需要呼叫另一個物件協助時,無須在程式碼中建立被呼叫者,而是依賴於外部容器,由外部容器建立後傳遞給程式
Spring 框架使用依賴注入(DI )實現 IOC
Spring 容器是一個超級大工廠,負責建立、管理所有的 Java 物件,這些 Java 物件被稱為 Bean。Spring 容器管理著容器中 Bean 之間的依賴關係,Spring 使用“依賴注入”的方式來管理 Bean 之間的依賴關係。使用 IOC 實現物件之間的解耦和
二、Spring的第一個程式
1. 建立Maven專案
下面的直接下一步就可以了,具體的看之前寫的關於Maven的操作
建立成功的如下:
2. 加入maven依賴pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.md</groupId>
<artifactId>01-hello-spring</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!--單元測試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--spring依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
</dependencies>
<build>
</build>
</project>
3. 定義介面和實體類
package com.md.service;
/**
* @author MD
* @create 2020-08-07 17:32
*/
public interface SomeService {
void doSome();
}
//-----------------------------------------
package com.md.service.impl;
import com.md.service.SomeService;
/**
* @author MD
* @create 2020-08-07 17:33
*/
public class SomeServiceImpl implements SomeService {
public SomeServiceImpl() {
System.out.println("我是SomeServiceImpl的無參構造方法");
}
@Override
public void doSome() {
System.out.println("執行了SomeServiceImpl的doSome()方法");
}
}
4. 建立Spring的配置檔案
在src/main/resources目錄下建立xml檔案,具體如下:檔名可以隨意,但 Spring 建議的名稱為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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
spring的配置檔案
1. beans:根標籤,spring把java物件成為bean
2. spring-beans.xsd是約束檔案,和mybatis的dtd類
-->
<!--
spring在建立物件的時候,宣告bean,就是告訴spring要建立某個類的物件
id: 這個物件自定義名稱,唯一,spring通過這個id能找到物件
class:類的全限定名稱(不能是介面的,因為spring是反射機制創造物件的)
spring就完成這樣的工作 SomeService someService = new SomeServiceImpl();
spring是把建立好的物件放入到map中,spring框架中有一個map存放物件
spring.put(id值,物件)
例:springMap.put("someService",new SomeServiceImpl());
一個 bean 標籤宣告一個物件
-->
<bean id="someService" class="com.md.service.impl.SomeServiceImpl" />
</beans>
- spring在建立物件的時候,宣告bean,就是告訴spring要建立某個類的物件
- id: 這個物件自定義名稱,唯一,spring通過這個id能找到物件
- class:類的全限定名稱(不能是介面的,因為spring是反射機制創造物件的)
5. 定義測試類
spring預設建立物件的時間:在建立spring的容器時,就建立配置檔案中的<所有物件>
spring建立物件,預設呼叫的是無參的構造方法
@Test
public void test02(){
// 使用spring容器建立物件,spring配置檔案在類路徑下
// 1. 指定spring配置檔名稱
String config = "beans.xml";
//2. 表示建立spring容器的物件, ApplicationContext
// ApplicationContext就是表示Spring容器,通過容器獲取物件了
// ClassPathXmlApplicationContext:表示從類路徑中載入spring的配置檔案,
// 如圖所示,得把beans.xml放到編譯好的target下面的classes中
// 若自動放的話這裡就不用放了,如果出現找不到這個檔案的時候手動放就行了
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
System.out.println("------------------");
//3. 從容器中獲取某個物件, 你要呼叫物件的方法
//getBean("配置檔案中的bean的id值")
SomeService someService = (SomeService) ac.getBean("someService");
// 4. 使用spring建立好的物件來呼叫方法
someService.doSome();
// 我是SomeServiceImpl的無參構造方法
// ------------------
// 執行了SomeServiceImpl的doSome()方法
}
當執行報錯找不到beans.xml檔案的時候,手動複製一個就可以了
6. 使用spring建立非自定義類物件
在Spring的配置檔案beans.xml中新增
<!--
spring能建立一個非自定義類的物件嗎?建立一個已經存在的類的物件
-->
<bean id="mydate" class="java.util.Date" />
在測試類
/**
* 獲取一個非自定義的類的物件
*/
@Test
public void test04(){
String config = "beans.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
// 獲取物件
Date d = (Date) ac.getBean("mydate");
System.out.println(d);
}
7. 獲取spring容器中java物件的資訊
@Test
public void test03(){
String config = "beans.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
// 使用spring提供的方法,獲取容器中定義的物件的數量
int count = ac.getBeanDefinitionCount();
System.out.println(count);
// 容器中定義的每個物件的名稱
String[] names = ac.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
三、使用Spring框架的步驟
- 加入依賴
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
- 建立類:介面、實現類、或者沒有介面的類
- 建立spring的配置檔案,使用<bean>標籤宣告物件
<bean id="someService" class="com.md.service.impl.SomeServiceImpl" />
- 我們使用容器中的物件,通過ApplicationContext介面和它的實現類ClassPathXmlApplicationContext的方法getBean("要使用的id")
四、總結
1. 什麼是spring
- 是一個框架,核心技術是ioc、aop,實現解耦合
- spring是一個容器,容器中存放的是java物件,需要做的是把物件放入到容器中
2. 怎麼使用spring
- spring是一個容器,把專案中用的物件放入到容器中
- 讓容器完成物件的建立、物件之間的關係的管理也就是屬性的賦值
- 我們在程式中從容器中獲取到想使用的物件
3. 什麼樣的物件放入容器中
- dao類、service類、controller類、工具類
spring中物件預設都是單例,在容器中這個物件只有一個
4. 不放入spring容器中的物件
- 實體類物件,實體類的資料是來自資料庫的
- servlet、listener、filter等(這幾個是來自Tomcat的)