【SSM框架】Spring筆記 --- Spring概述;IOC控制反轉詳解

来源:https://www.cnblogs.com/Burning-youth/archive/2022/05/25/16310646.html
-Advertisement-
Play Games

Spring框架是一個容器,是一個整合了很多其他框架的框架,它的核心是 IOC 和 AOP ...


1、什麼是Spring框架


它是一個容器,整合其它框架的框架,它的核心是 IOC 和 AOP。Spring 框架由20多個模塊構成,它在很多領域都提供了優秀的解決方案。

 

2、Spring的特點


1)輕量級

由20多個模塊構成,每個jar包都很小,小於1M,核心包也就3M左右;

對代碼無污染;    

2)面向介面編程

使用介面,就是面向靈活。項目的可擴展性,可維護性都極高。使用時介面指向實現類,切換實現類即可切換整個功能。

3)AOP --- 面向切麵編程

就是將公共的,通用的,重覆的代碼單獨開發,在需要的時候反織回去,底層的原理是動態代理。

4)整合其它框架

大魚吃小魚,Spring整合了很多優秀的框架。

 

3、什麼是IOC


  • 控制反轉 IOC(Inversion of Control)是一個概念,是一種思想。由Spring容器進行對象的創建和依賴註入,程式員在使用時直接取出使用。

正轉:由程式員進行對象的創建和依賴註入稱為正轉.程式員說了算。

//程式員創建對象
Student stu = new Student();   
//程式員進行賦值
stu.setName("張三");           
stu.setAge(22);

 

反轉:由Spring容器創建對象和依賴註入稱為反轉,將控制權從程式員手中奪走,由給Spring容器,稱為反轉,容器說了算。

<!--Spring容器負責對象的創建-->
<bean id="stu" class="com.bjpowernode.pojo.Student">     
    <!--Spring容器依賴註入值-->
    <property name="name" value="張三"/>                    
    <property name="age" value="22"/> 
</bean>

 切記:Spring容器在啟動時,就創建所有的對象(stu、、、)

 

4、基於xml的IOC  


1)創建對象

<bean id="stu" class="com.bjpowernode.pojo.Student"></bean>

 

2)給創建的對象賦值

A.使用setter註入,註入分為簡單類型註入和引用類型註入:

  • 簡單類型註入值使用value屬性;(簡單類型指的是 【8種基本類型+String】)
  • 引用類型註入值使用ref屬性

 

<!--必須要註意:使用setter註入必須提供無參的構造方法,必須提供setXXX()方法.-->
<!--創建學生對象-->
<bean id="stu" class="com.bjpowernode.pojo2.Student">
    <!--簡單類型註入-->
    <property name="name" value="李四"></property>    
    <property name="age" value="22"></property>
    <!--引用類型註入-->
    <property name="school" ref="school"></property>  
</bean>

<!--創建學校對象-->
<bean id="school" class="com.bjpowernode.pojo2.School">
    <property name="name" value="清華大學"></property>
    <property name="address" value="海澱區"></property>
</bean>

 

 

B.使用構造方法註入

a.使用構造方法的參數名稱進行註入值            

<bean id="school" class="com.bjpowernode.pojo3.School">
    <constructor-arg name="name1" value="清華大學"></constructor-arg>
    <constructor-arg name="address1" value="海澱區"></constructor-arg>
</bean>


b.使用構造方法參數的下標註入值

<bean id="stu" class="com.bjpowernode.pojo3.Student">
    <constructor-arg index="0" value="錢七"></constructor-arg>
    <constructor-arg index="1" value="22"></constructor-arg>
    <constructor-arg index="2" ref="school"></constructor-arg>
</bean>

 

c.使用預設的構造方法的參數的順序註入值

<bean id="stuSequence" class="com.bjpowernode.pojo3.Student">
    <constructor-arg value="陳十"></constructor-arg>
    <constructor-arg value="22"></constructor-arg>
    <constructor-arg ref="school"></constructor-arg>
</bean>

 

 

5、基於註解的IOC


  • 基於註解的 IOC 也稱為DI(Dependency Injection),它是IOC的具體實現的技術.

 

基於註解的IOC,必須要在Spring的核心配置文件中添加包掃描.

<context:component-scan base-package="com.bjpowernode.s01"></context:component-scan>

 1)創建對象的註解:

@Component:可以創建任意對象.創建的對象的預設名稱是類名的駝峰命名法,也可以指定對象的名稱@Component("指定名稱").

@Controller:專門用來創建控制器的對象(Servlet),這種對象可以接收用戶的請求,可以返回處理結果給客戶端.

@Service:專門用來創建業務邏輯層的對象,負責向下訪問數據訪問層,處理完畢後的結果返回給界面層.

@Repository:專門用來創建數據訪問層的對象,負責資料庫中的增刪改查所有操作.

案例:

@Component("stu")  //交給Spring去創建對象,就是在容器啟動時創建
public class Student {
    //簡單類型的值註入
    @Value("張三")  
    private String name;
    @Value("22")
    private int age;
}


    
2)依賴註入的註解

用來給簡單類型註入值:

@Value:

 

引用類型的註入

A.@Autowired:使用類型註入值,從整個Bean工廠中搜索同源類型的對象進行註入.

  • 什麼是同源類型:

a.被註入的類型(Student中的school)與註入的類型是完全相同的類型

b.被註入的類型(Student中的school父)與註入的類型(子)是父子類

c.被註入的類型(Student中的school介面)與註入的類型(實現類)是介面和實現類的類型

註意:在有父子類的情況下,使用按類型註入,可能有多個可註入的對象.此時按照名稱進行二次篩選,選中與被註入對象相同名稱的對象進行註入.
     

B.使用名稱註入值,從整個Bean工廠中搜索相同名稱的對象進行註入.

@Autowired

@Qualifier("名稱")

註意:如果有父子類的情況下,直接按名稱進行註入值;兩個註解都有才起按名稱註入值的作用

 

6、添加包掃描的方式


1)單個包掃描(推薦使用)

<context:component-scan base-package="com.bjpowernode.controller"></context:component-scan>
<context:component-scan base-package="com.bjpowernode.service.impl"></context:component-scan>
<context:component-scan base-package="com.bjpowernode.dao"></context:component-scan>

 

2)多個包掃描,多個包之間以逗號或空格或分號分隔

<context:component-scan base-package="com.bjpowernode.controller com.bjpowernode.service ,com.bjpowernode.dao"></context:component-scan>


3)掃描根包(不推薦)

<context:component-scan base-package="com.bjpowernode"></context:component-scan>
  • 會降低容器啟動的速度,導致多做無用功.

 

7、為應用指定多個 Spring 配置文件


當項目越來越大,需要多人合作開發,只用一個配置文件就存在很大隱患.

1)拆分配置文件的策略

A.按層拆

applicationContext_controller.xml(寫關於界面層的操作)        

<bean id="uController" class="com.bjpowernode.controller.UsersController">
<bean id="bController" class="com.bjpowernode.controller.BookController">

 

applicationContext_service.xml (寫關於業務邏輯層的操作)

<bean id="uService" class="com.bjpowernode.controller.UsersService">
<bean id="bService" class="com.bjpowernode.controller.BookService">

 

applicationContext_mapper.xml(寫關於數據訪問層的操作)        

<bean id="uMapper" class="com.bjpowernode.controller.UsersMapper">
<bean id="bMapper" class="com.bjpowernode.controller.BookMapper">

 

B.按功能拆

applicationContext_users.xml        

<bean id="uController" class="com.bjpowernode.controller.UsersController">
<bean id="uService" class="com.bjpowernode.controller.UsersService">
<bean id="uMapper" class="com.bjpowernode.controller.UsersMapper">

 

applicationContext_book.xml      

<bean id="bController" class="com.bjpowernode.controller.BookController">
<bean id="bService" class="com.bjpowernode.controller.BookService">
<bean id="bMapper" class="com.bjpowernode.controller.BookMapper">

 

8、spring配置文件的整合


1)單個文件導入

<import resource="applicatoinContext_mapper.xml"></import>
<import resource="applicatoinContext_service.xml"></import>
<import resource="applicatoinContext_controller.xml"></import>

 

2)批量導入

<import resource="applicatoinContext_*.xml"></import>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 內置指令 v-show : 說明:根據條件展示元素,true展示元素,false隱藏元素 版本:vue2,vue3 <template> <div> <button v-show="isShow"></button> </div> </template> <script> export def ...
  • 本文記錄如何在 Vue2 環境下儘量使用 Vue3 的 Composition-api 並配合 Vuetify2 使用 ...
  • 切麵:公共的,通用的,重覆的功能稱為切麵,面向切麵編程就是將切麵提取出來,單獨開發,在需要調用的方法中通過動態代理的方式進行織入 ...
  • 1.微服務架構是什麼? 由很多個微服務來組成,並且每個服務與服務有自己獨立的資料庫,服務與服務之間是通過輕量級的協議(比如:rpc,http等)來調用,每個服務是獨立的,自治的能夠獨立的發佈和部署。如下圖: 本質上來講,微服務只是一種架構風格。架構風格如何採取,那麼就需要涉及到架構特征這個概念。而架 ...
  • 1. Java基礎(1)——ThreadLocal 1.1. ThreadLocal ThreadLocal是一個泛型類,當我們在一個類中聲明一個欄位:private ThreadLocal<Foo> threadLocalFoo = new ThreadLocal<>();時,這時候,即使不同的線 ...
  • 事務原本是資料庫中的概念,在實際項目的開發中,進行事務的處理一般是在業務邏輯層, 即 Service 層。這樣做是為了能夠使用事務的特性來管理關聯操作的業務。 ...
  • 第一章 : 開始 1.1 編寫一個簡單的C++程式 要點:每個函數有且只能擁有一個main函數,且main的預設返回是一個int類型。 函數定義:返回類型,函數名,形參列表,函數體 ###1.1.1編譯 運行程式 ####程式源文件命名約定 無論使用命令行還是IDE(集成開發環境),都將代碼存放在一 ...
  • 對JavaSE_關鍵字 介面 代碼塊 枚舉 相關重要知識點進行了介紹和總結 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...