spring 的概述和入門

?
我是南城余!阿里云開發者平臺專家博士證書獲得者!

歡迎關注我的博客!一同成長!

一名從事運維開發的worker,記錄分享學習。

專注于AI,運維開發,windows Linux 系統領域的分享!

本章節對應知識庫

https://www.yuque.com/nanchengcyu/java

本內容來自尚硅谷課程,此處在知識庫做了個人理解

1、概述

1.1、Spring是什么?

Spring 是一款主流的 Java EE 輕量級開源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并創立,其目的是用于簡化 Java 企業級應用的開發難度和開發周期。Spring的用途不僅限于服務器端的開發。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。Spring 框架除了自己提供功能外,還提供整合其他技術和框架的能力。

Spring 自誕生以來備受青睞,一直被廣大開發人員作為 Java 企業級應用程序開發的首選。時至今日,Spring 儼然成為了 Java EE 代名詞,成為了構建 Java EE 應用的事實標準。

自 2004 年 4 月,Spring 1.0 版本正式發布以來,Spring 已經步入到了第 6 個大版本,也就是 Spring 6。本課程采用Spring當前最新發布的正式版本6.0.2

在這里插入圖片描述

1.2、Spring 的狹義和廣義

在不同的語境中,Spring 所代表的含義是不同的。下面我們就分別從“廣義”和“狹義”兩個角度,對 Spring 進行介紹。

廣義的 Spring:Spring 技術棧

廣義上的 Spring 泛指以 Spring Framework 為核心的 Spring 技術棧。

經過十多年的發展,Spring 已經不再是一個單純的應用框架,而是逐漸發展成為一個由多個不同子項目(模塊)組成的成熟技術,例如 Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security 等,其中 Spring Framework 是其他子項目的基礎。

這些子項目涵蓋了從企業級應用開發到云計算等各方面的內容,能夠幫助開發人員解決軟件發展過程中不斷產生的各種實際問題,給開發人員帶來了更好的開發體驗。

狹義的 Spring:Spring Framework

狹義的 Spring 特指 Spring Framework,通常我們將它稱為 Spring 框架。

Spring 框架是一個分層的、面向切面的 Java 應用程序的一站式輕量級解決方案,它是 Spring 技術棧的核心和基礎,是為了解決企業級應用開發的復雜性而創建的。

Spring 有兩個最核心模塊: IoC 和 AOP。

IoC:Inverse of Control 的簡寫,譯為“控制反轉”,指把創建對象過程交給 Spring 進行管理。

AOP:Aspect Oriented Programming 的簡寫,譯為“面向切面編程”。AOP 用來封裝多個類的公共行為,將那些與業務無關,卻為業務模塊所共同調用的邏輯封裝起來,減少系統的重復代碼,降低模塊間的耦合度。另外,AOP 還解決一些系統層面上的問題,比如日志、事務、權限等。

1.3、Spring Framework特點

  • 非侵入式:使用 Spring Framework 開發應用程序時,Spring 對應用程序本身的結構影響非常小。對領域模型可以做到零污染;對功能性組件也只需要使用幾個簡單的注解進行標記,完全不會破壞原有結構,反而能將組件結構進一步簡化。這就使得基于 Spring Framework 開發應用程序時結構清晰、簡潔優雅。

  • 控制反轉:IoC——Inversion of Control,翻轉資源獲取方向。把自己創建資源、向環境索取資源變成環境將資源準備好,我們享受資源注入。

  • 面向切面編程:AOP——Aspect Oriented Programming,在不修改源代碼的基礎上增強代碼功能。

  • 容器:Spring IoC 是一個容器,因為它包含并且管理組件對象的生命周期。組件享受到了容器化的管理,替程序員屏蔽了組件創建過程中的大量細節,極大的降低了使用門檻,大幅度提高了開發效率。

  • 組件化:Spring 實現了使用簡單的組件配置組合成一個復雜的應用。在 Spring 中可以使用 XML 和 Java 注解組合這些對象。這使得我們可以基于一個個功能明確、邊界清晰的組件有條不紊的搭建超大型復雜應用系統。

  • 一站式:在 IoC 和 AOP 的基礎上可以整合各種企業應用的開源框架和優秀的第三方類庫。而且 Spring 旗下的項目已經覆蓋了廣泛領域,很多方面的功能性需求可以在 Spring Framework 的基礎上全部使用 Spring 來實現。

1.4、Spring模塊組成

官網地址:https://spring.io/

在這里插入圖片描述

上圖中包含了 Spring 框架的所有模塊,這些模塊可以滿足一切企業級應用開發的需求,在開發過程中可以根據需求有選擇性地使用所需要的模塊。下面分別對這些模塊的作用進行簡單介紹。

①Spring Core(核心容器)

spring core提供了IOC,DI,Bean配置裝載創建的核心實現。核心概念: Beans、BeanFactory、BeanDefinitions、ApplicationContext。

  • spring-core :IOC和DI的基本實現

  • spring-beans:BeanFactory和Bean的裝配管理(BeanFactory)

  • spring-context:Spring context上下文,即IOC容器(AppliactionContext)

  • spring-expression:spring表達式語言

②Spring AOP

  • spring-aop:面向切面編程的應用模塊,整合ASM,CGLib,JDK Proxy
  • spring-aspects:集成AspectJ,AOP應用框架
  • spring-instrument:動態Class Loading模塊

③Spring Data Access

  • spring-jdbc:spring對JDBC的封裝,用于簡化jdbc操作
  • spring-orm:java對象與數據庫數據的映射框架
  • spring-oxm:對象與xml文件的映射框架
  • spring-jms: Spring對Java Message Service(java消息服務)的封裝,用于服務之間相互通信
  • spring-tx:spring jdbc事務管理

④Spring Web

  • spring-web:最基礎的web支持,建立于spring-context之上,通過servlet或listener來初始化IOC容器
  • spring-webmvc:實現web mvc
  • spring-websocket:與前端的全雙工通信協議
  • spring-webflux:Spring 5.0提供的,用于取代傳統java servlet,非阻塞式Reactive Web框架,異步,非阻塞,事件驅動的服務

⑤Spring Message

  • Spring-messaging:spring 4.0提供的,為Spring集成一些基礎的報文傳送服務

⑥Spring test

  • spring-test:集成測試支持,主要是對junit的封裝

1.5、Spring6特點

1.5.1、版本要求

(1)Spring6要求JDK最低版本是JDK17

1.5.2、本課程軟件版本

(1)IDEA開發工具:2022.1.2

(2)JDK:Java17**(Spring6要求JDK最低版本是Java17)**

(3)Spring:6.0.2

2、入門

2.1、環境要求

  • JDK:Java17+(Spring6要求JDK最低版本是Java17)

  • Maven:3.6+

  • Spring:6.0.2

2.2、構建模塊

(1)構建父模塊spring6

在idea中,依次單擊 File -> New -> Project -> New Project

在這里插入圖片描述

點擊“Create”

在這里插入圖片描述

刪除src目錄

(2)構建子模塊spring6-first

在這里插入圖片描述

點擊 Create 完成

在這里插入圖片描述

2.3、程序開發

2.3.1、引入依賴

https://spring.io/projects/spring-framework#learn

添加依賴:

<dependencies><!--spring context依賴--><!--當你引入Spring Context依賴之后,表示將Spring的基礎依賴引入了--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.2</version></dependency><!--junit5測試--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.3.1</version></dependency>
</dependencies>

查看依賴:

在這里插入圖片描述

2.3.2、創建java類
package com.atguigu.spring6.bean;public class HelloWorld {public void sayHello(){System.out.println("helloworld");}
}
2.3.3、創建配置文件

在resources目錄創建一個 Spring 配置文件 beans.xml(配置文件名稱可隨意命名,如:springs.xm)

在這里插入圖片描述

<?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"><!--配置HelloWorld所對應的bean,即將HelloWorld的對象交給Spring的IOC容器管理通過bean標簽配置IOC容器所管理的bean屬性:id:設置bean的唯一標識class:設置bean所對應類型的全類名--><bean id="helloWorld" class="com.atguigu.spring6.bean.HelloWorld"></bean></beans>
2.3.4、創建測試類測試
package com.atguigu.spring6.bean;import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class HelloWorldTest {@Testpublic void testHelloWorld(){ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");HelloWorld helloworld = (HelloWorld) ac.getBean("helloWorld");helloworld.sayHello();}
}
2.3.5、運行測試程序

2.4、程序分析

1. 底層是怎么創建對象的,是通過反射機制調用無參數構造方法嗎?

修改HelloWorld類:

package com.atguigu.spring6.bean;public class HelloWorld {public HelloWorld() {System.out.println("無參數構造方法執行");}public void sayHello(){System.out.println("helloworld");}
}

執行結果:

在這里插入圖片描述

測試得知:創建對象時確實調用了無參數構造方法。

2. Spring是如何創建對象的呢?原理是什么?

// dom4j解析beans.xml文件,從中獲取class屬性值,類的全類名// 通過反射機制調用無參數構造方法創建對象Class clazz = Class.forName("com.atguigu.spring6.bean.HelloWorld");//Object obj = clazz.newInstance();Object object = clazz.getDeclaredConstructor().newInstance();

3. 把創建好的對象存儲到一個什么樣的數據結構當中了呢?

bean對象最終存儲在spring容器中,在spring源碼底層就是一個map集合,存儲bean的map在DefaultListableBeanFactory類中:

private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

Spring容器加載到Bean類時 , 會把這個類的描述信息, 以包名加類名的方式存到beanDefinitionMap 中,
Map<String,BeanDefinition> , 其中 String是Key , 默認是類名首字母小寫 , BeanDefinition , 存的是類的定義(描述信息) , 我們通常叫BeanDefinition接口為 : bean的定義對象。

2.5、啟用Log4j2日志框架

2.5.1、Log4j2日志概述

在項目開發中,日志十分的重要,不管是記錄運行情況還是定位線上問題,都離不開對日志的分析。日志記錄了系統行為的時間、地點、狀態等相關信息,能夠幫助我們了解并監控系統狀態,在發生錯誤或者接近某種危險狀態時能夠及時提醒我們處理,同時在系統產生問題時,能夠幫助我們快速的定位、診斷并解決問題。

Apache Log4j2是一個開源的日志記錄組件,使用非常的廣泛。在工程中以易用方便代替了 System.out 等打印語句,它是JAVA下最流行的日志輸入工具。

Log4j2主要由幾個重要的組件構成:

(1)日志信息的優先級,日志信息的優先級從高到低有TRACE < DEBUG < INFO < WARN < ERROR < FATAL
TRACE:追蹤,是最低的日志級別,相當于追蹤程序的執行
DEBUG:調試,一般在開發中,都將其設置為最低的日志級別
INFO:信息,輸出重要的信息,使用較多
WARN:警告,輸出警告的信息
ERROR:錯誤,輸出錯誤信息
FATAL:嚴重錯誤

這些級別分別用來指定這條日志信息的重要程度;級別高的會自動屏蔽級別低的日志,也就是說,設置了WARN的日志,則INFO、DEBUG的日志級別的日志不會顯示

(2)日志信息的輸出目的地,日志信息的輸出目的地指定了日志將打印到控制臺還是文件中

(3)日志信息的輸出格式,而輸出格式則控制了日志信息的顯示內容。

2.5.2、引入Log4j2依賴
<!--log4j2的依賴-->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.19.0</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j2-impl</artifactId><version>2.19.0</version>
</dependency>
2.5.3、加入日志配置文件

在類的根路徑下提供log4j2.xml配置文件(文件名固定為:log4j2.xml,文件必須放到類根路徑下。)

<?xml version="1.0" encoding="UTF-8"?>
<configuration><loggers><!--level指定日志級別,從低到高的優先級:TRACE < DEBUG < INFO < WARN < ERROR < FATALtrace:追蹤,是最低的日志級別,相當于追蹤程序的執行debug:調試,一般在開發中,都將其設置為最低的日志級別info:信息,輸出重要的信息,使用較多warn:警告,輸出警告的信息error:錯誤,輸出錯誤信息fatal:嚴重錯誤--><root level="DEBUG"><appender-ref ref="spring6log"/><appender-ref ref="RollingFile"/><appender-ref ref="log"/></root></loggers><appenders><!--輸出日志信息到控制臺--><console name="spring6log" target="SYSTEM_OUT"><!--控制日志輸出的格式--><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/></console><!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,適合臨時測試用--><File name="log" fileName="d:/spring6_log/test.log" append="false"><PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/></File><!-- 這個會打印出所有的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮,作為存檔--><RollingFile name="RollingFile" fileName="d:/spring6_log/app.log"filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"><PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/><SizeBasedTriggeringPolicy size="50MB"/><!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件,這里設置了20 --><DefaultRolloverStrategy max="20"/></RollingFile></appenders>
</configuration>
2.5.4、測試

運行原測試程序

在這里插入圖片描述

運行原測試程序,多了spring打印日志

2.5.5、使用日志
public class HelloWorldTest {private Logger logger = LoggerFactory.getLogger(HelloWorldTest.class);@Testpublic void testHelloWorld(){ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");HelloWorld helloworld = (HelloWorld) ac.getBean("helloWorld");helloworld.sayHello();logger.info("執行成功");}
}

控制臺:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

?

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

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

相關文章

信號量的使用和注意事項

大家好&#xff0c;今天給大家介紹信號量的使用和注意事項&#xff0c;文章末尾附有分享大家一個資料包&#xff0c;差不多150多G。里面學習內容、面經、項目都比較新也比較全&#xff01;可進群免費領取。 信號燈(信號量)集 POSIX 線程中的同步用的是無名信號量 進程間的同步使…

喬拓云平臺:微信小程序開發的全新視角與高效路徑

隨著微信小程序的日益普及&#xff0c;越來越多的人開始關注如何開發自己的小程序。對于沒有開發經驗的人來說&#xff0c;借助第三方平臺如喬拓云&#xff0c;可以輕松實現小程序的開發。本文將介紹微信小程序開發需要學習的東西&#xff0c;并探討如何借助喬拓云平臺進行無經…

基于深度學習的鋼鐵缺陷檢測系統(含UI界面,Python代碼,數據集、yolov8)

項目介紹 項目中所用到的算法模型和數據集等信息如下&#xff1a; 算法模型&#xff1a; ? ? yolov8 yolov8主要包含以下幾種創新&#xff1a; ? ? ? ? 1. 添加注意力機制&#xff08;SE、CBAM等&#xff09; ? ? ? ? 2. 修改可變形卷積&#xff08;DySnake-主干c…

【改進YOLOv8】融合可變形大核注意力D-LKA-Attention的油氣管道設備泄露檢測系統

1.研究背景與意義 項目參考AAAI Association for the Advancement of Artificial Intelligence 研究背景與意義 隨著油氣管道設備的廣泛應用&#xff0c;油氣泄露問題已經成為一個嚴重的環境和安全隱患。油氣泄露不僅會造成環境污染&#xff0c;還可能引發火災、爆炸等嚴重事…

掌握vue中國際化使用及配置

文章目錄 &#x1f341;i18n組件安裝&#x1f341;項目中配置 vue-i18n&#x1f341;編寫語言包&#x1f341;國際化的使用 隨著互聯網的普及和全球化的發展&#xff0c;開發國際化的應用程序已經成為一種趨勢。因此&#xff0c;將 VUE 應用程序國際化是非常有必要的。 以下是…

新時代商業旨意:傳統商家如何變革?

隨著新時代的到來&#xff0c;商業環境也在不斷變化。在這個信息爆炸、消費者需求日益復雜化的時代&#xff0c;商業旨意已經不再僅僅是追求利潤&#xff0c;而是轉向了以客戶為中心&#xff0c;追求價值共創、社會責任等多元化的目標。傳統商家面臨著諸多挑戰&#xff0c;如何…

2023四川大學“騰訊杯”新生賽(同步賽)糖果(鴿巢原理)

這個數據范圍, n 是 1 e 6 &#xff0c; a i 也是 1 e 6 n是1e6&#xff0c;a_i也是1e6 n是1e6&#xff0c;ai?也是1e6&#xff0c;任意 a i a j ∈ [ 0 , 2 e 6 ] a_ia_j \in [0, 2e6] ai?aj?∈[0,2e6]&#xff0c;所以如果有答案我們最多枚舉 2 e 6 2e6 2e6個數就可以找到…

視頻剪輯高手揭秘:如何批量減少時長并調整播放速度,提升視頻效果

隨著社交媒體的興起&#xff0c;視頻制作的需求越來越大。然而往往視頻文件存在一些問題&#xff0c;例如時長過長&#xff0c;或者要調整播放速度以更好地傳達信息。這些問題不僅影響了視頻的觀看體驗&#xff0c;也可能導致視頻難以在社交媒體上獲得廣泛的傳播。那么&#xf…

Android Canvas 改變背景顏色

我有一個有兩個 View 的應用 <com.myexample.ui.view.BackgroundView android:id"id/id_draw_canvas_classroom" android:layout_width"fill_parent" android:layout_height"fill_parent" android:layout_marginBottom"3dp" andro…

[EFI]Atermiter X99 Turbo D4 E5-2630v3電腦 Hackintosh 黑蘋果efi引導文件

硬件型號驅動情況主板 Atermiter X99 Turbo D4 處理器 Intel Xeon E5-2630v3 已驅動內存Desktop DDR4 2666 MHz已驅動硬盤Netac NV7000已驅動顯卡AMD Radeon RX 5700xt已驅動聲卡瑞昱 英特爾 High Definition Audio 控制器ALC897已驅動網卡LucyRTL8125已驅動無線網卡藍牙Broad…

基于Java個人作品管理系統

基于Java個人作品管理系統 功能需求 1、作品上傳&#xff1a;系統允許用戶上傳各種類型的作品&#xff0c;如文字、圖片、音頻、視頻等。上傳過程應簡單明了&#xff0c;支持批量上傳。 2、作品分類&#xff1a;系統需要提供作品分類功能&#xff0c;用戶可以根據自己的需求…

CNN,DNN,RNN,GAN,RL+圖像處理常規算法(未完待續)

好的&#xff0c;讓我們先介紹一些常見的神經網絡模型&#xff0c;然后再討論圖像處理的常規算法。 神經網絡模型&#xff1a; 1. CNN&#xff08;卷積神經網絡&#xff09; 原理&#xff1a; CNN主要用于處理圖像數據。它包含卷積層、池化層和全連接層。卷積層通過卷積操作…

文件夾重命名:提升工作效率,使用關鍵詞替換法重命名文件夾

在日常生活和工作中&#xff0c;經常要處理大量的文件夾和文件。有時候&#xff0c;為了更好地管理和查找文件&#xff0c;要給文件夾重新命名。但是&#xff0c;重命名文件夾并不是一件容易的事情&#xff0c;尤其是當文件夾數量眾多時。一個一個修改耗費極大的時間和精力&…

《C++新經典設計模式》之第19章 職責鏈模式

《C新經典設計模式》之第19章 職責鏈模式 職責鏈模式.cpp 職責鏈模式.cpp #include <iostream> #include <memory> #include <string> using namespace std;// 請求傳遞給鏈中的若干對象&#xff0c;哪個對象適合處理就自行處理 // 使多個對象都有機會處理請…

后端返回base64文件前端如何下載

1.后端返回base64格式文件 2.前端代碼 <style lang"less" scoped> import "./style/common.less";.table-div-a {color: #409EFF;text-decoration: underline;cursor: pointer; } </style><template><div class"template-con…

一文搞懂什么是Hadoop

Hadoop概念 什么是Hadoop Hadoop是一個由Apache基金會所開發的用于解決海量數據的存儲及分析計算問題的分布式系統基礎架構。 廣義上來說&#xff0c;Hadoop通常指一個跟廣泛的概念——Hadoop生態圈。 以下是hadoop生態圈中的技術&#xff1a; Hadoop優勢 hadoop組成 HDFS…

一個不錯的文章偽原創系統程序源碼

一款文章偽原創系統程序源碼免費分享&#xff0c;程序是站長原創的。 一共花了站長幾天時間寫的這個文章偽原創平臺&#xff0c;程序無需數據庫。 程序前端采用BootStrap框架搭建&#xff0c;后端采用PHP原生書寫。 前端偽原創采用Ajax無刷新提交&#xff0c;Ajax轉換到詞庫…

TCPUDP使用場景討論

將鏈路從TCP改為UDP會對通信鏈路產生以下影響和注意事項&#xff1a; 可靠性&#xff1a;UDP是無連接的協議&#xff0c;與TCP相比&#xff0c;它不提供可靠性保證和重傳機制。因此&#xff0c;當將鏈路從TCP改為UDP時&#xff0c;通信的可靠性會降低。如果在通信過程中丟失了U…

【爬取二手車并將數據保存在數據庫中】

爬取二手車并將數據保存在數據庫中 查看網頁結構分析爬取步驟解密加密信息將密文解密代碼&#xff1a; 進行爬取&#xff1a;爬取函數寫入解密文件函數和獲取城市函數解密文件&#xff0c;返回正確字符串函數保存到數據庫 運行結果 查看網頁結構分析爬取步驟 可以看出網頁使用…

C 語言 變量

變量初始值 全局變量&#xff1a;初始值是 0 局部變量&#xff1a;初始值是 隨機的 類型限定符 通常不需要顯式使用 register 關鍵字來優化變量的存儲和訪問。 關鍵字 _Complex和_Imaginary分別用于表示復數和虛數&#xff08;二者皆是數學概念&#xff09; 變量的聲明和定義 c…