Spring 框架(1-4)

第一章:Spring 框架概述

1.1 Spring 框架的定義與背景

Spring 是一個開源的輕量級 Java 開發框架,于 2003 年由 Rod Johnson 創立,旨在解決企業級應用開發的復雜性。其核心設計思想是面向接口編程松耦合架構,通過分層設計(如表現層、業務層、數據訪問層)實現各組件的獨立復用,并通過?控制反轉(IoC)?和?面向切面編程(AOP)?兩大核心技術簡化開發流程。

Spring 框架的定位是?Java SE/EE 全棧一站式框架,它不直接替代其他框架(如 MyBatis、Struts 等),而是通過集成機制整合各類技術,降低開發復雜度。

1.2 Spring 框架的核心優點
  1. 解耦與 IoC 管理
    • Spring 作為 “對象工廠”,負責創建和管理對象的生命周期及依賴關系,開發者無需手動創建對象,而是通過配置或注解讓 Spring 注入依賴,大幅降低組件耦合度。
  2. AOP 編程支持
    • 通過切面編程,將橫切關注點(如日志、事務、權限)與業務邏輯分離,避免代碼冗余,提升可維護性。
  3. 聲明式事務管理
    • 無需手動編寫事務代碼,通過注解或配置即可實現事務的提交、回滾,簡化數據庫操作。
  4. 便捷的測試支持
    • 集成 JUnit 4,通過注解(如?@RunWith(SpringJUnit4ClassRunner.class))可直接測試 Spring 管理的組件。
  5. 框架集成能力
    • 內置對主流框架(如 Hibernate、MyBatis、Spring MVC 等)的支持,通過配置即可完成整合。
  6. 簡化 JavaEE API 調用
    • 對復雜的 JavaEE API(如 JDBC、JavaMail)進行封裝,提供更簡潔的接口,降低使用門檻。

第二章:Spring 的 IoC 核心技術

2.1 什么是 IoC(控制反轉)

IoC(Inverse of Control)即 “控制反轉”,指將對象的創建、初始化和依賴關系管理從應用代碼中剝離,轉由 Spring 容器負責。傳統開發中,對象的生命周期由代碼直接控制(如?new Object()),而 IoC 框架通過配置或注解 “反轉” 了這種控制權,使應用代碼僅需關注業務邏輯,無需關心對象創建細節。

2.2 IoC 解決的核心問題:降低程序耦合度
  • 傳統開發的耦合問題
    若類 A 依賴類 B,則 A 內部需直接創建 B 的實例(如?B b = new B();),此時 A 與 B 強耦合,若 B 的實現類變更,A 的代碼也需修改。
  • IoC 模式的改進
    通過 Spring 容器配置類 A 對類 B 的依賴,容器在創建 A 時自動注入 B 的實例(如通過構造器或 setter 方法)。此時 A 僅依賴 B 的接口,不關心具體實現,實現了接口與實現的解耦
2.3 IoC 的實現方式:依賴注入(DI)

IoC 的核心實現機制是?依賴注入(Dependency Injection,DI),即 Spring 容器在創建對象時,將其依賴的組件通過以下方式注入:

  1. 構造器注入
    • 通過類的構造方法傳入依賴對象。
    • 示例(XML 配置):
      <bean id="userService" class="com.example.UserService"><constructor-arg ref="userDao" />
      </bean>
      
  2. Setter 方法注入
    • 通過類的 setter 方法傳入依賴對象。
    • 示例(注解方式):
      @Service
      public class UserService {private UserDao userDao;@Autowiredpublic void setUserDao(UserDao userDao) {this.userDao = userDao;}
      }
      
2.4 IoC 容器的核心接口
  • BeanFactory:Spring IoC 容器的基礎接口,定義了加載、創建、管理 Bean 的基本功能。
  • ApplicationContext:BeanFactory 的子接口,擴展了國際化、事件發布、資源加載等功能,是 Spring 應用中常用的容器接口(如?AnnotationConfigApplicationContext)。
2.5 IOC的程序入門

創建Java工程,導入坐標依賴

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency></dependencies>

編寫接口和實現類,編寫具體的實現方法

packagecom.qcbyjy.service;?publicinterfaceUserService{?publicvoidhello();?}??packagecom.qcbyjy.service;?publicclassUserServiceImplimplementsUserService{@Overridepublicvoidhello(){System.out.println("HelloIOC!!");}}

編寫Spring核心的配置文件,在src目錄下創建applicationContext.xml的配置 文件,名稱是可以任意的,但是一般都會使用默認名稱。

<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--IOC管理bean--><beanid="userService"class="com.qcbyjy.service.UserServiceImpl"/></beans>

為什么class是impl而不是,userservice?

因為?ioc管理bean ,bean是類。必須要可以實例化才行。

怎么確認他是配置文件的?

通過最頂部的配置信息確認?

把log4j.properties的配置文件拷貝到resources目錄下,做為log4j的日志配置 文件。 編寫測試方法。

packagecom.qcbyjy.test;?importcom.qcbyjy.service.UserService;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;?publicclassDemo1{?/***入門程序
*/@Testpublicvoidrun1(){//使用Spring的工廠
ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");//通過工廠獲得類:UserServiceuserService=(UserService)applicationContext.getBean("userService");userService.hello();}?}

2.6??IOC技術總結

ApplicationContext接口,工廠的接口,使用該接口可以獲取到具體的Bean對 象。該接口下有兩個具體的實現類。springCould配置中心 ClassPathXmlApplicationContext,加載類路徑下的Spring配置文件。 FileSystemXmlApplicationContext,加載本地磁盤下的Spring配置文件。

    @Testpublic void run0(){ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService=context.getBean("userService",UserService.class);userService.hello();}@Testpublic void  run1(){ApplicationContext context=new FileSystemXmlApplicationContext("D:\\Spring627\\src\\main\\resources\\applicationContext.xml");UserService userService=context.getBean("userService",UserService.class);userService.hello();}

?2.7?Spring框架的Bean管理的配置文件方式

?id屬性,Bean起個名字,在約束中采用ID的約束,唯一,取值要求:必須以字 母開始,可以使用字母、數字、連字符、下劃線、句話、冒號id:不能出現特殊 字符。

class屬性,Bean 對象的全路徑。
scope屬性,scope屬性代表Bean 的作用范圍。
singleton單例(默認值),最常用的方式。
prototype 多例

request應用在Web項目中,每次HTTP請求都會創建一個新的 Bean
session應用在Web項目中,同一個HTTP Session 共享一個 BeanBean對象的創建和銷毀的兩個屬性配置
說明:Spring初始化 bean 或銷毀 bean 時,有時需要作一些處理工作,因此spring可以在創建和拆卸bean 的時候調用 bean 的兩個生命周期方法
init-method,當bean 被載入到容器的時候調用 init-method 屬性指定的方法destroy-method,當bean 從容器中刪除的時候調用 destroy-method 屬性指定的方法

<bean id="userService" class="com.qcby.service.UserServiceImpl" scope="prototype" init-method="init" destroy-method="destory"/>

?singleton單例

   @Testpublic void run2(){ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService=context.getBean("userService",UserService.class);UserService userService1=context.getBean("userService",UserService.class);System.out.println(userService);System.out.println(userService1);}

prototype 多例

2.8?實例化Bean對象的三種方式

默認是無參數的構造方法(默認方式,基本上使用)

<bean id="us" class="com.qcbyjy.service.UserServiceImpl" />

靜態工廠實例化方式

package com.qcbyjy.demo1;?import com.qcbyjy.service.UserService;import com.qcbyjy.service.UserServiceImpl;?/*** 靜態工廠方式
*/public class StaticFactory {?// 靜態工廠方式
public static UserService createUs(){System.out.println("通過靜態工廠的方式創建UserServiceImpl對
象...");// 編寫很多業務邏輯 權限校驗
returnnewUserServiceImpl();}?}?<beanid="us"class="com.qcbyjy.demo1.StaticFactory"factory-method="createUs"/>

實例工廠實例化方式

packagecom.qcbyjy.demo1;?importcom.qcbyjy.service.UserService;importcom.qcbyjy.service.UserServiceImpl;?/****動態工廠方式
**/publicclassDfactory{?publicUserServicecreateUs(){System.out.println("實例化工廠的方式...");returnnewUserServiceImpl();}?}?<beanid="dfactory"class="com.qcbyjy.demo1.Dfactory"/><beanid="us"factory-bean="dfactory"factory-method="createUs"/>

?第三章:DI依賴注入

3.1依賴注入的概述

IOC和DI的概念 IOC:InverseofControl,控制反轉,將對象的創建權反轉給Spring!! DI:DependencyInjection,依賴注入,在Spring框架負責創建Bean對象時, 動態的將依賴對象注入到Bean組件中!!

3.2屬性的set方法注入值

編寫屬性,提供該屬性對應的set方法,編寫配置文件完成屬性值的注入

packagecom.qcbyjy.service;?importcom.qcbyjy.dao.OrderDao;?publicclassOrderServiceImplimplementsOrderService{?//編寫成員屬性,一定需要提供該屬性的set方法
privateOrderDaoorderDao;//一定需要提供該屬性的set方法,IOC容器底層就通過屬性的set方法方式注
入值
publicvoidsetOrderDao(OrderDaoorderDao){this.orderDao=orderDao;}?//消息
privateStringmsg;//年齡
privateintage;?publicvoidsetMsg(Stringmsg){this.msg=msg;}?publicvoidsetAge(intage){this.age=age;}?@OverridepublicvoidsaveOrder(){System.out.println("業務層:保存訂單..."+msg+"-"+age);//調用
orderDao.saveOrder();}?}??packagecom.qcbyjy.dao;
?publicclassOrderDaoImplimplementsOrderDao{?@OverridepublicvoidsaveOrder(){System.out.println("持久層:保存訂單...");}?}??<!--DI:依賴注入--><beanid="os"class="com.qcbyjy.service.OrderServiceImpl"><propertyname="orderDao"ref="od"/><propertyname="msg"value="你好"/><propertyname="age"value="30"/></bean><beanid="od"class="com.qcbyjy.dao.OrderDaoImpl"></bean>
3.3 屬性構造方法方式注入值

對于類成員變量,構造函數注入。

packagecom.qcbyjy.demo2;?publicclassCar{?//名稱
privateStringcname;//金額
privateDoublemoney;?publicCar(Stringcname,Doublemoney){this.cname=cname;this.money=money;}?@OverridepublicStringtoString(){return"Car{"+"cname='"+cname+'\''+",money="+money+
'}';}?}?<beanid="car"class="com.qcbyjy.demo2.Car"><constructor-argname="cname"value="大奔"/><constructor-argname="money"value="400000"/></bean>

?3.4? 數組,集合(List,Set,Map),Properties 等的注入

packagecom.qcbyjy.demo3;?importjava.util.Arrays;importjava.util.List;importjava.util.Map;importjava.util.Properties;?publicclassCollectionBean{?//數組
privateString[]strs;publicvoidsetStrs(String[]strs){this.strs=strs;}?privateList<String>list;publicvoidsetList(List<String>list){this.list=list;}?privateMap<String,String>map;publicvoidsetMap(Map<String,String>map){this.map=map;}?privatePropertiesproperties;publicvoidsetProperties(Propertiesproperties){this.properties=properties;
}?@OverridepublicStringtoString(){return"CollectionBean{"+"strs="+Arrays.toString(strs)+",list="+list+",map="+map+",properties="+properties+'}';}}?<!--給集合屬性注入值--><beanid="collectionBean"class="com.qcbyjy.demo3.CollectionBean"><propertyname="strs"><array><value>美美</value><value>小鳳</value></array></property><propertyname="list"><list><value>熊大</value><value>熊二</value></list></property><propertyname="map"><map><entrykey="aaa"value="老王"/><entrykey="bbb"value="小王"/></map></property><propertyname="properties"><props><propkey="username">root</prop><propkey="password">123456</prop></props></property></bean>

第四章:多配置文件方式

4.1??多配置文件的加載方式

在src的目錄下又多創建了一個配置文件,現在是兩個核心的配置文件,那么加 載這兩個配置文件的方式有兩種!

主配置文件中包含其他的配置文件:<importresource="applicationContext2.xml"/>?
工廠創建的時候直接加載多個配置文件:ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");

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

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

相關文章

RabitQ 量化:既省內存又提性能

突破高維向量內存瓶頸:Mlivus Cloud RaBitQ量化技術的工程實踐與調優指南 作為大禹智庫高級研究員,擁有三十余年向量數據庫與AI系統架構經驗的我發現,在當今多模態AI落地的核心場景中,高維向量引發的內存資源消耗問題已成為制約系統規模化部署的“卡脖子”因素。特別是在大…

創客匠人:創始人 IP 打造的得力助手

在當今競爭激烈的商業環境中&#xff0c;創始人 IP 的打造對于企業的發展愈發重要。一個鮮明且具有影響力的創始人 IP&#xff0c;能夠為企業帶來獨特的競爭優勢&#xff0c;提升品牌知名度與美譽度。創客匠人在創始人 IP 打造過程中扮演著不可或缺的角色&#xff0c;為創始人提…

如何為虛擬機上的 Manjaro Linux啟用 VMware 拖放功能

如果你的Manjaro 發行版本是安裝在 VMware Workstation Player 上使用的 &#xff0c;而且希望可以通過拖放功能將文件或文件夾從宿主機復制到客戶端的Manjaro 里面&#xff0c;那么可以按照以下的步驟進行操作&#xff0c;開啟拖放功能。 在 VMware 虛擬機上安裝 Manjaro 后&…

【C/C++】單元測試實戰:Stub與Mock框架解析

C 單元測試中的 Stub/Mock 框架詳解 在單元測試中&#xff0c;Stub&#xff08;打樁&#xff09;和Mock都是替代真實依賴以簡化測試的技術。通常&#xff0c;Stub&#xff08;或 Fake&#xff09;提供了一個簡化實現&#xff0c;用于替代生產代碼中的真實對象&#xff08;例如…

工廠 + 策略設計模式(實戰教程)

在軟件開發中&#xff0c;設計模式是解決特定問題的通用方案&#xff0c;而工廠模式與策略模式的結合使用&#xff0c;能在特定業務場景下發揮強大的威力。本文將基于新增題目&#xff08;題目類型有單選、多選、判斷、解答&#xff09;這一業務場景&#xff0c;詳細闡述如何運…

Nuxt3中使用 Ant-Design-Vue 的BackTop 組件實現自動返回頁面頂部

在現代 Web 應用中&#xff0c;提供一個方便用戶返回頁面頂部的功能是非常重要的。Ant Design Vue 提供了 BackTop 組件&#xff0c;可以輕松實現這一功能。本文將詳細介紹如何在 Nuxt 3 項目中使用 <a-back-top/> 組件&#xff0c;并通過按需引入的方式加載組件及其樣式…

在統信UOS(Linux)中構建SQLite3桌面應用筆記

目錄 1 下載lazarus 2 下載sqlite3源碼編譯生成庫文件 3 新建項目 4 設置并編譯 一次極簡單的測試&#xff0c;記錄一下。 操作系統&#xff1a;統信UOS&#xff0c; 內核&#xff1a;4.19.0-arm64-desktop 處理器&#xff1a;D3000 整個流程難點是生成so庫文件并正確加…

Host ‘db01‘ is not allowed to connect to this MariaDB server 怎么解決?

出現錯誤 ERROR 1130 (HY000): Host db01 is not allowed to connect to this MariaDB server&#xff0c;表示當前用戶 test 沒有足夠的權限從主機 db01 連接到 MariaDB 服務器。以下是逐步解決方案&#xff1a; 1. 檢查用戶權限 登錄 MariaDB 服務器&#xff08;需本地或通過…

打造高可用的大模型推理服務:基于 DeepSeek 的企業級部署實戰

&#x1f4dd;個人主頁&#x1f339;&#xff1a;一ge科研小菜雞-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、引言&#xff1a;從“能部署”到“可用、好用、能擴展” 近年來&#xff0c;隨著 DeepSeek、Qwen、Yi 等開源大模型的持續發…

Spring Boot 使用 ElasticSearch

第一步&#xff0c;開啟本地的 ElasticSearch 啟動 elasticSearch.bat npm run start (head 插件) 第二步&#xff0c;在 Spring Boot 項目中引入依賴 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-hig…

軟件開發的“中庸之道”:因勢而為,心中有數

【軟件工程】軟件開發的“中庸之道”&#xff1a;因勢而為&#xff0c;心中有數 在軟件開發的方法論討論中&#xff0c;我們常常陷入非此即彼的二元對立&#xff1a;要么追求極致的規范化和流程化&#xff0c;嚴格遵循軟件工程的各項標準&#xff1b;要么完全摒棄方法論&#x…

Go和Elixir極簡HTTP服務對比

Go 和 Elixir 都是我非常喜歡的編程語言&#xff0c;這次來對比下它們實現一個原生極簡 HTTP 服務的過程。 Go 語言標準庫自帶了網絡服務庫&#xff0c;只需要簡單幾行代碼就可以實現一個網絡服務&#xff0c;這也是一開始它吸引我的一個方面。而 Elixir 標準庫本身沒有網絡服…

為何要學習Objective-C?從環境搭建開始

目錄 前言 Swift時代為何還要學Objective-C&#xff1f; 開發環境搭建 1. 安裝Xcode 2. 創建第一個Command Line Tool項目 初識Objective-C代碼 編寫"Hello, Objective-C!" 編譯運行程序 為什么Objective-C中的NSLog和NSString前面都有"NS"前綴&a…

ubuntu18.04安裝 gcc 9以及2019版本tbb

一、安裝gcc 9 ubuntu18.04默認是用的gcc7.5 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update sudo apt-get install gcc-9 g-9 下面是配置優先用哪個版本的gcc和g &#xff0c;后面帶的值越大越優先用誰&#xff0c;并且配置完全局生效不僅僅是在當…

JdbcUtils的三個版本以及sql注入問題

JDBC的工具類 1.0版本 JDBC的工具類 2.0版本&#xff08;智能一些&#xff09;&#xff0c;編寫properties屬性文件&#xff0c;程序就可以讀取屬性文件 JDBC的工具類 3.0版本&#xff0c;加入連接池對象 我們封裝jdbc工具類是為了減少代碼重復&#xff0c;方便開發&#xff0…

AS32系列MCU芯片I2C模塊性能解析與調試

國科安芯推出的AS32X601內置的I2C模塊提供了符合工業標準的兩線串行制接口&#xff0c;可用于MCU和外部IIC設備的通訊。IIC總線使用兩條串行線&#xff1a;串行數據線SDA和串行時鐘線SCL。 IIC接口模塊實現了IIC協議的標準模式和快速模式&#xff0c;支持多主機IIC總線架構。其…

釘釘小程序開發實戰:打造一個簡約風格的登錄頁面

在上一篇文章中&#xff0c;我們已經介紹了如何搭建釘釘小程序的基礎環境&#xff0c;并完成了項目的初始化配置。本文將繼續深入&#xff0c;手把手帶你實現一個簡約風格的登錄頁面&#xff0c;這是大多數企業級應用不可或缺的一部分。 釘釘小程序基于前端 Web 技術棧&#x…

論文研讀2-1:多GNSS雙歷元純相位定位-模型建立與誤差分析

后續文章: 論文研讀2-2&#xff1a;多GNSS雙歷元純相位定位-固定模糊度精度增益 論文研讀2-3&#xff1a;多GNSS雙歷元純相位定位-定位精度分析 僅相位定位中的模糊度解算問題 在衛星導航定位中&#xff0c;載波相位測量是實現高精度定位的基礎&#xff0c;但如果僅使用相位測…

Python----OpenCV(圖像増強——圖像平滑、均值濾波、高斯濾波、中值濾波、雙邊濾波)

Python----計算機視覺處理&#xff08;Opencv&#xff1a;圖像噪點消除&#xff1a;濾波算法&#xff0c;噪點消除&#xff09; 一、圖像平滑 圖像平滑處理&#xff08;Smoothing Images&#xff09;&#xff0c;也稱為圖像模糊處理、圖像濾波&#xff08;Images Filtering&am…

筆記:使用EasyExcel導入csv文件出現編碼問題,導致導入數據全為null的解決方法

筆記&#xff1a;使用EasyExcel導入csv文件出現編碼問題&#xff0c;導致導入數據全為null的解決方法 通常情況下&#xff0c;我們使用excel導入&#xff0c;但是部分情況下或者領導要求&#xff0c;我們需要使用csv導入文件&#xff0c;但是csv文件模板下載之后會變成系統當前…