?
我是南城余!阿里云開發者平臺專家博士證書獲得者!
歡迎關注我的博客!一同成長!
一名從事運維開發的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("執行成功");}
}
控制臺:
?