Spring—IoC

目錄

1. IoC的提出

2. Spring容器

2.1. Spring容器實現原理

2.2. Spring組件

2.2.1 XML標簽方式

2.2.2. 類注解方式

2.2.3. 方法注解方式

2.3. Spring容器分類

2.3.1. BeanFactory容器

2.3.2.?ApplicationContext容器

2.3.3.?WebApplicationContext容器

3. Spring中的常用注解


1. IoC的提出

? ? ? ?在采用面向對象方法設計的軟件系統中,底層實現是由一組對象組成的,所有的對象通過彼此的合作,最終實現系統的業務邏輯。對象之間的耦合關系就像手表齒輪的嚙合,彼此之間存在復雜依賴關系,往往牽一發而動全身,如圖1所示。因此,如何降低系統之間、模塊之間和對象之間的耦合度,是軟件工程追求的目標之一1996年,軟件專家Michael mattson首次提出了控制反轉(Inversion of Control, IoC)概念。控制反轉的核心思想是:借助于“第三方(IoC容器)” 實現具有依賴關系的對象之間的解耦,如圖2所示。

圖1. 傳統面向對象系統

圖2. 使用IoC容器的面向對象系統

? ? ? ? 在使用IoC容器的面向對象系統中,全部對象的控制權都交給IoC容器來管理,所以,IoC容器成為整個系統的關鍵核心,它起到了一種類似“粘合劑”的作用,把系統中的所有對象粘合在一起發揮作用。

? ? ? ?2004年,Martin Fowler探討了同一個問題,既然IoC是控制反轉,那么到底是“哪些方面的控制被反轉了呢”?最后,他得出結論是“獲得依賴對象的過程被反轉了”。控制被反轉之后,獲得依賴對象的過程由自身管理變為由IoC容器主動注入。于是,他給“控制反轉”取了一個更合適的名字叫做“依賴注入(Dependency Injection, DI)”。所以,依賴注入(DI)和控制反轉(IoC)是從不同的角度來描述同一件事情,就是指通過引入IoC容器,利用依賴關系注入的方式,實現對象之間的解耦。

2. Spring容器

? ? ? ?Spring容器是Spring框架的核心,它是一種IoC容器,負責管理應用程序中對象的生命周期和依賴關系。Spring容器通過讀取Spring組件的元數據((XML文件、注解或Java配置))來創建、配置、裝配并管理應用程序中的對象。

2.1. Spring容器實現原理

? ? ? ? 實現Spring容器的最主要技術是Java反射編程Java的反射機制是指在程序的運行狀態中,可以構造任意一個類的對象,可以了解任意一個對象所屬的類,可以了解任意一個類的成員變量和方法,可以調用任意一個對象的屬性和方法。簡單來說,只要給定類的名字,就可以通過反射機制來獲得類的所有信息。Spring容器的工作模式可以看作是工廠模式的升華。可以把Spring容器看作是一個對象工廠,這個工廠里要生產的對象都在元數據中給出定義,然后利用反射編程,根據元數據(XML文件、注解或Java配置)中給出的類名生成相應的對象。從實現來看,Spring是把工廠模式里寫死的對象生成代碼,改變為由元數據來定義,也就是把工廠和對象生成這兩者獨立離開來,目的是提高靈活性和可維護性。Spring容器的實現原理如圖3所示。

? 圖3. Spring容器實現原理

2.2. Spring組件

? ? ? 納入Spring容器管理的Java類稱為Spring組件(簡稱組件),Spring容器對組件進行實例化所創建的對象稱為Bean。一個Java類可以標識為多個Spring組件,每個Spring組件可以創建一個或多個Bean。定義Spring組件主要有三種方式:XML標簽、類注解和方法注解。

2.2.1 XML標簽方式

? ? ? ?該方式通過在XML配置文件中使用<bean>標簽來定義Spring組件。下面通過一個例子來說明如何通過<bean>標簽來定義組件和創建Bean。

(1)類的定義

? ? ? ? ? 在包com.my.examples.example1中定義Java類Login和User,類的聲明如下:

package com.my.examples.example1;public class Login {String username;String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
package com.my.examples.example1;public class User {Login login;public void print(){System.out.println("login user: "+login.getUsername());}public Login getLogin() {return login;}public void setLogin(Login login) {this.login = login;}
}

?(2)Spring組件定義

? ? ? ? 在項目的resources目錄下創建spring-config.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:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 定義Spring組件 --><bean id="login" class="com.my.examples.example1.Login"><!--為屬性code和name注入初始值 --><property name="username" value="admin"></property><property name="password" value="123456"></property></bean><bean id="currentUser" class="com.my.examples.example1.User"><!-- 為屬性login注入引用值(Spring組件login) --><property name="login" ref="login"></property></bean>
</beans>

(3)配置Spring應用上下文

? ? ? ?根據XML配置文件創建Spring容器,利用容器所提供的getBean()方法獲取相應的Bean,從容中獲取Bean后就可以調用其方法來執行。

package com.my.examples.example1;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {//根據XML配置文件創建Spring容器ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//獲取Spring容器中的BeanLogin login= context.getBean("login", Login.class);User user=context.getBean("currentUser", User.class);user.print();}
}

運行類Test,在控制臺中輸出如下信息:

login user: admin

2.2.2. 類注解方式

? ? ? ?該方式通過@Component、@Respository、@Service、@Controller注解來定義Spring組件,利用Java配置類(用@Configuration注解定義的類)代替XML配置文件。@Component注解用于標識一個類為Spring組件,當Spring框架掃描到該注解時,會創建該類的實例并納入Spring容器中管理。@Respository、@Service、@Controller都是@Component注解的特殊形式,分別用于標識數據訪問層、服務層和控制層的Spring組件。

? ? ? 下面將2.1.1節中的例子改為類注解方式。

(1)Spring組件的定義

? ? ? 在包com.my.examples.example2中定義Java類Login和User,在類上加入@Component注解使其成為Spring組件。

package com.my.examples.example2;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;@Component  //定義Spring組件
@PropertySource("classpath:my-config.properties") //引入外部屬性文件
public class Login {@Value("${my.username}")  //注入屬性文件中的account值String username;@Value("${my.password}")  //注入屬性文件中的password值String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
package com.my.examples.example2;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component   //定義Spring組件
public class User {@Autowired  //注入注入依賴的Spring組件的BeanLogin login;public void print(){System.out.println("login user: "+login.getUsername());}
}

? ? ? ?@PropertySource注解的功能是引入外部屬性文件:my-config.properties,該文件位于項目的resources目錄下,文件的內容如下:

my.username=admin
my.password=123456

(2)Java配置類的定義

? ? ? 在包com.my.examples.example2中定義類Config,在該類上加入@Configuraton注解使其成為Java配置類。在該配置類上加入@ComponentScan注解,其功能是讓Spring容器掃描com.my.examples.example2包及其子包下面所有的Spring組件,并將這些組件進行例化為Bean。

package com.my.examples.example2;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration   //定義Java配置類
//掃描包com.my.examples.example2及其子包下面的所有Spring組件
@ComponentScan("com.my.examples.example2")
public class Config {
}

(3)配置Spring應用上下文

? ? ? 根據Java配置類創建Spring容器,利用容器提供的getBean()方法獲取相應的Bean,調用Bean提供的方法來執行任務。

package com.my.examples.example2;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Test {public static void main(String[] args) {//根據Java配置類創建Spring容器AnnotationConfigApplicationContext context = newAnnotationConfigApplicationContext(Config.class);//獲取容器中的BeanLogin login=context.getBean(Login.class);User user=context.getBean(User.class);user.print();}
}

運行類Test,在控制臺中輸出如下內容:

login user: admin

2.2.3. 方法注解方式

? ? ? ?該方式不需要在類上加入@Component等注解來定義Spring組件,而是通過在Java配置類中的方法上加入@Bean注解,該方法的返回值是一個Spring組件的Bean。

? ? ? 下面把第2.1.2節中的應用改為采用Java配置的方式來實現。

(1)類的定義

? ? ? ?在包com.my.examples.example3中定義Java類Login和User。

package com.my.examples.example3;public class Login {String username;String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
package com.my.examples.example3;public class User {Login login;public void print(){System.out.println("login user: "+login.getUsername());}public Login getLogin() {return login;}public void setLogin(Login login) {this.login = login;}
}

(2)定義Java配置類

package com.my.examples.example3;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;@Configuration   //定義Java配置類
//掃描包com.my.examples.example3及其子包下面的所有Spring組件
@ComponentScan("com.my.examples.example3")
@PropertySource("classpath:my-config.properties") //引入外部屬性文件
public class Config {@Value("${my.username}")String username;@Value("${my.password}")String password;@Bean    //定義Spring組件并返回Beanpublic Login login(){Login login = new Login();//注入屬性值login.setUsername(username);login.setPassword(password);return login;}@Bean   //定義Spring組件并返回Beanpublic User user(){User user = new User();//注入組件Login的Bean時,直接調用方法login()user.setLogin(login());return user;}
}

(3)配置Spring應用上下文

? ? ? ?根據Java配置類創建Spring容器,根據容器提供的getBean()方法獲取相應的Bean,調用Bean的方法執行任務。

package com.my.examples.example3;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Test {public static void main(String[] args) {//根據Java配置類創建Spring容器AnnotationConfigApplicationContext context = newAnnotationConfigApplicationContext(Config.class);//獲取容器中的BeanLogin login = context.getBean(Login.class);User user = context.getBean(User.class);user.print();}
}

運行類Test,在控制臺中輸出如下內容:

login user: admin

2.3. Spring容器分類

? ? ?Spring框架主要提供三種類型的容器:BeanFactory容器、ApplicationContext容器和WebApplicationContext

2.3.1. BeanFactory容器

? ? ? ?BeanFactory是Spring框架中用于管理 Bean的最基本接口,它提供了一系列用于獲取Bean和管理 Bean依賴的方法。BeanFactory使用懶加載方式,即只有在需要時才創建和配置bean。

? ? ? ?BeanFactory接口包含的的主要方法:

  • Object getBean(String name):根據bean的名稱在Spring容器中獲取對應的Bean實例。
  • Object getBean(String name, Object... args):根據 Bean 的名稱和給定的構造函數參數獲取一個 Bean 實例。
  • boolean containsBean(String name):判斷Spring容器中是否包含指定名稱的bean。
  • boolean?isSingleton(String name):判斷指定名稱的bean是否是單例。
  • boolean isPrototype(String name):判斷指定名稱的bean是否是原型。

? ? ?BeanFactory接口的主要實現類:

  • XmlBeanFactory:這是一個簡單的實現,它從 XML 文件中加載 Bean 定義,從 Spring 3.1 開始,該類已被標記為過時。
  • DefaultListableBeanFactory:它提供了一套完整的服務來管理不同的 Bean,包括注冊 Bean、解析依賴、管理 Bean 生命周期、以及提供不同的 Bean 作用域等。

2.3.2.?ApplicationContext容器

? ? ? ?ApplicationContext是BeanFactory的子接口,它在BeanFactory的基礎上增加了更多的功能。除了提供BeanFactory的所有功能外,ApplicationContext還提供了更多企業特定的功能,如國際化支持、事件發布、應用層特定的上下文等。ApplicationContext在容器啟動時就創建和配置所有的單例bean,提供了更多的高級特性。

? ? ? ApplicationContext接口的主要實現類:

  • ClassPathXmlApplicationContext:從類路徑下的XML文件加載Spring應用上下文。這是在傳統的 Spring 應用中常見的一種方式,適合那些配置存儲在項目內部的XML文件中的應用。
  • FileSystemXmlApplicationContext:從文件系統指定的位置的XML文件加載Spring應用上下文。這種方式適用于需要從外部文件系統(而非類路徑)加載配置的場景。
  • AnnotationConfigApplicationContext:從一個或多個基于Java的配置類中加載Spring應用上下文。這種方式專門為基于Java注解的配置提供支持。

2.3.3.?WebApplicationContext容器

? ? ? ?WebApplicationContext是專門為 Web 應用程序設計的,它擴展了 ApplicationContext 接口,添加了一些針對Web環境的特定功能。WebApplicationContext通常在基于Spring的Web應用程序中使用,特別是在使用Spring MVC框架時,它通常在web.xml文件中配置,或者通過Spring 的WebApplicationInitializer接口在Java配置中啟動。

? ? ? ?WebApplicationContext接口的主要實現類:

  • XmlWebApplicationContext:從XML文件加載配置的Web應用上下文,這是一個傳統的方法,適合那些已經使用XML配置文件的項目。
  • AnnotationConfigWebApplicationContext:支持基于Java注解的配置,允許通過Java代碼直接配置Spring,使得配置更加直觀和類型安全。

3. Spring中的常用注解

? ? ? 在Spring框架中,與Spring容器相關的注解如下表。

注解功能
@Component

通用注解,用于標識一個類為Spring組件,當Spring框架掃描到該注解時,會創建該類的實例并納入Spring容器管理。

@Respository、@Service、@Controller都是這個注解的特殊形式,分別用于標識數據訪問層、服務層和控制層的Spring組件。

@Respository該注解用于標注數據訪問層組件,數據訪問層組件通常用于數據操作。
@Service

該注解用于標注服務層組件,服務層組件通常用于業務邏輯處理。

@Controller

該注解用于標注控制層組件,控制層組件通常用于處理HTTP請求。

@Autowired

自動裝配注解,它可以放在類的成員變量、方法以及構造方法上,用于自動注入依賴,@Autowired是按照類型注入依賴,如果想要按照名稱來注入依賴,則需要結合@Qualifier注解一起使用。

@Resource與@Autowired功能一樣,區別在于該注解默認是按照名稱來注入依賴,只有當找不到與名稱匹配的Bean時才會按照類型來注入依賴
@Qualifier與@Autowired一起使用,用于指定要注入的Bean的名稱
@Configuration用于定義配置類,可替代XML文件,類中的方法可以使用@Bean注解,以聲明Spring容器管理的Bean。
@Bean用于標識一個方法,該方法返回一個Bean實例,并將其注冊到Spring容器中。
@Scope

用于指定Bean的作用域,分為如下幾種:

1)singleton(單例):只創建一個Bean,這是默認的作用域,適用于無狀態Bean,比如服務層Bean、數據訪問層Bean;

2)prototype(原型):每次請求(通過getBean方法)都會創建一個新的Bean,適用于有狀態的Bean;

3)request(請求):在Web應用中,每一次HTTP請求都會產生一個新的Bean,該Bean僅在當前HTTP請求內有效;

4)session(會話):在Web應用中,每個HTTP會話都會創建一個新的Bean,該請求僅在當前HTTP會話內有效;

5)global-session(全局會話):僅在Portlet應用中使用,每個全局HTTP會話會創建一個Bean,適用于需要在全局HTTP會話期間保持狀態的Bean。

6)application(應用):在整個ServletContext范圍內,Bean都是單例的,適用于需要在整個Web用用范圍內共享的Bean。

@Value用于注入簡單類型的屬性值,如字符串、數字等。
@Async用于標識一個方法或類,表示其中的操作應該異步執行。
@PostConstruct用于標識一個方法,該方法在Bean實例化后自動執行,用于初始化操作。
@PreDestroy用于標識一個方法,該方法在Bean銷毀前自動執行,用于清理操作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13975.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13975.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13975.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Srping 歷史

一、History of Spring and the Spring Framework Spring came into being in 2003 as a response to the complexity of the early J2EE specifications. While some consider Java EE and its modern-day successor Jakarta EE to be in competition with Spring, they are …

nginx 配置stream模塊代理并開啟日志配置

前言 nginx 1.20.1 nginx從1.9.0開始,新增加了一個stream模塊 確保nginx 安裝時開啟stream模塊 ./configure \ …… \ --with-stream \ --with-stream_ssl_module \ 修改nginx.conf #增加stream配置&#xff0c;開啟stream模塊 stream {log_format basic $remote_addr [$…

stm32 作為從機, fpga 作為主機,進行 spi 通信

stm32 作為從機, fpga 作為主機,進行 spi 通信 STM32和FPGA之間的SPI通信是直連形式。使用FPGA讀取傳感器的值,傳輸到STM32中進行計算。 STM32是將SPI接受過來的數據存儲到DMA中。 #include "SPI_DMA.h" #include <stm32f10x.h> uint8_t spi_buf[4];//FP…

idea啟動報錯:java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory

文章目錄 一、問題二、解決方法 一、問題 問題描述&#xff1a;idea整合Mybatis-plus的時候&#xff0c;啟動報錯&#xff1a;java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory 二、解決方法 可能原因&#xff1a;仔細檢查了一下&#xff0c;發現 mybati…

《王者榮耀》4月狂攬2.34億美元 單日流水1億美元 全球銷量第二

易采游戲網5月24日消息&#xff0c;在剛剛過去的四月&#xff0c;全球手游市場迎來了一場收益的盛宴&#xff0c;其中《王者榮耀》以其驚人的吸金能力&#xff0c;以2.34億美元的月收入在全球手游排行榜上位列第二。4月5日&#xff0c;這款由騰訊游戲開發的多人在線戰斗競技游戲…

C++相關概念和易錯語法(14)(初始化注意事項、vector、編譯器向上查找規則)

1.當我們在代碼中想要終止運行的話&#xff0c;我們可以采用Ctrl C或Ctrl Z&#xff0c;其中^C代表殺進程&#xff0c;^Z設置結束2.編碼表&#xff1a;我們目前比較熟悉的是ASCII碼編碼方式&#xff0c;但是我們發現平時使用的漢字無法通過ASCII編碼&#xff0c;除此之外&…

前端canvas項目實戰——在線圖文編輯器:序

目錄 前言一、 博主是誰&#xff1f;二、 關于本專欄1. 本專欄涉及的技術棧2. 專欄適合誰來學習&#xff1f;3. 你可以從專欄學到什么&#xff1f;4. 系列文章索引 三、 付費信息后記 前言 很高興&#xff0c;今天我又為自己設定了一個目標&#xff1a;帶領大家從入門HTML5中的…

自動化測試用例結構

標準的用例結構&#xff1a; 用力標題前提條件用例步驟預期結果實際結果 測試用例對比&#xff1a;

酷開系統 | 酷開科技把握智慧先機 AI賦能家庭場景

智慧化是當今世界科技發展的前沿領域之一。現在的智慧化&#xff0c;也正在逐步成為我們日常生活的一部分。電視系統也進入了數字化時代&#xff0c;AI的應用正在不斷擴展&#xff0c;其潛力似乎無窮無盡。 酷開科技深耕人工智能技術&#xff0c;在提升語音體驗、強化智能家居…

(1)無線電失控保護(二)

文章目錄 前言 4 參數配置 5 測試 6 使用接收器設置飛行模式(

第二證券:新股申購配號數什么意思?

股配號數量便是我們參與抽簽的數量&#xff0c;投資者申購新股之后&#xff0c;交易所會根據持有的股票市值進行配號。 投資者的市值越大&#xff0c;申購新股的配號越多&#xff0c;其中簽機會越大。主板、創業板、科創板一個申購單位是500股&#xff0c;意味著1萬元的市值有…

Scrapy 從創建到運行

Scrapy是一個強大的Python框架&#xff0c;專門用于構建網絡爬蟲。 步驟1&#xff1a;安裝Scrapy 首先&#xff0c;你需要安裝Scrapy框架來進行后續操作。以下是具體操作步驟&#xff1a; 1、使用pip命令安裝Scrapy&#xff1a; pip install scrapy 步驟2&#xff1a;創建S…

Java 定義類型處理MySQL point類型數據

1.三個類來處理 引入maven依賴 <!-- 引入 jts 庫解析 POINT --><dependency><groupId>com.vividsolutions</groupId><artifactId>jts</artifactId><version>1.13</version></dependency>import javax.validation.constr…

MySQL的數據類型之文本類型

目錄 文本類型類型&#xff1a; CHAR(size) VARCHAR(size) TEXT TINYTEXT, MEDIUMTEXT, LONGTEXT BLOB, MEDIUMBLOB, LONGBLOB ENUM 在mysql中&#xff0c;常用數據類型有三種&#xff1a; 1、文本類型&#xff1b; 2、數字類型&#xff1b; 3、日期/時間類型&#xff1b; …

【C++入門】—— C++入門 (下)_內聯函數

前言&#xff1a;在了解完前面的C基礎內容后&#xff0c;馬上我們就要真正不如C的學習了&#xff0c;但在之前讓我們最后了解最后一點點C入門知識&#xff01;來遲的520特別篇&#xff01; 本篇主要內容&#xff1a; 內聯函數 auto關鍵字 范圍for 指針空值nullptr C入門 1. 內聯…

星戈瑞CY3-COOH染料的穩定性、熒光特性

CY3-COOH染料&#xff0c;作為一種多功能的熒光標記試劑&#xff0c;在生物醫學研究和熒光成像技術中應用。其穩定性和熒光特性使得它在科研實驗使用。 CY3-COOH染料的穩定性 CY3-COOH染料以其穩定性而應用。首先&#xff0c;它展現出了良好的化學穩定性&#xff0c;不易受到環…

智慧醫療時代:探索互聯網醫院開發的新篇章

在智慧醫療時代&#xff0c;互聯網醫院開發正引領著醫療服務的創新浪潮。通過將先進的技術與醫療服務相結合&#xff0c;互聯網醫院為患者和醫生提供了全新的互動方式&#xff0c;極大地提升了醫療服務的便捷性和效率。本文將深入探討互聯網醫院的開發&#xff0c;介紹其技術實…

一鍵部署!QQ AI 聊天機器人!支持ChatGPT、文心一言、訊飛星火、Bing、Bard、ChatGLM、POE,多賬號,人設調教

隨著人工智能技術的不斷發展&#xff0c;智能聊天機器人已經成為我們日常生活中不可或缺的一部分。ChatGPT作為一款強大的人工智能聊天模型&#xff0c;能夠為我們提供高效、便捷的聊天體驗。那么&#xff0c;如何將ChatGPT接入QQ&#xff0c;實現智能聊天新體驗呢&#xff1f;…

關于Git 的基本概念和使用方式

Git是一個分布式版本控制系統&#xff0c;用于跟蹤和管理代碼的改動。它具有以下基本概念和使用方式&#xff1a; 1. 倉庫&#xff08;Repository&#xff09;&#xff1a;Git使用倉庫來存儲代碼和相關的歷史記錄。倉庫可以是本地的&#xff0c;也可以是遠程的。本地倉庫保存在…

DB2學習筆記--1

一 數據控制語言(DCL) 1.GRANT語句 使用 GRANT 語句可以向單個用戶或組顯式授予權限和特權&#xff0c;授權對象包括數據庫、 表空間、表、視圖、索引、包和模式。 GRANT 的語法如下: GRANT privilege ON object-type object-name TO {USER|GROUP|PUBLIC} authorization-na…