測(cè)試同學(xué)從0到1上手Spring
最近在各個(gè)大廠的JD中關(guān)于測(cè)試平臺(tái)開發(fā)的職位信息頻頻曝光,有很多同學(xué)對(duì)該職位產(chǎn)生了極高的熱情。也有很多人對(duì)其望而卻步,認(rèn)為Spring、Spring boot這些東東太深?yuàn)W了,開發(fā)都很難搞定,自己是一個(gè)tester又怎能駕馭呢?為了打消大家的顧慮,我準(zhǔn)備了一系列文章,通過我一個(gè)測(cè)試人的視角(我是從零開始學(xué)習(xí),我懂測(cè)試同學(xué)的需求),用最通俗的語言幫大家搞定Spring基礎(chǔ)知識(shí),進(jìn)而快速理解Spring并在實(shí)際工作中進(jìn)行應(yīng)用!
Spring定義
Spring是一個(gè)開源框架,是為了解決企業(yè)應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的。框架的主要優(yōu)勢(shì)之一就是其分層架構(gòu),分層架構(gòu)允許您選擇使用哪一個(gè)組件,同時(shí)為 J2EE 應(yīng)用程序開發(fā)提供集成的框架。Spring 框架的 7 個(gè)模塊,如下圖所示:

每個(gè)模塊的功能如下:
Spring core:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實(shí)現(xiàn)。BeanFactory 使用控制反轉(zhuǎn)(IOC) 模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。
Spring Context:Spring 上下文是一個(gè)配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業(yè)服務(wù),例如 JNDI、EJB、電子郵件、國際化、校驗(yàn)和調(diào)度功能。
Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向切面的編程功能 , 集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的對(duì)象。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)。通過使用 Spring AOP,不用依賴組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。
Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫供應(yīng)商拋出的錯(cuò)誤消息。異常層次結(jié)構(gòu)簡化了錯(cuò)誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結(jié)構(gòu)。
Spring ORM:Spring 框架插入了若干個(gè) ORM 框架,從而提供了 ORM 的對(duì)象關(guān)系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務(wù)和 DAO 異常層次結(jié)構(gòu)。
Spring Web:Web 上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于 Web 的應(yīng)用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請(qǐng)求以及將請(qǐng)求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/p>
Spring MVC:MVC 框架是一個(gè)全功能的構(gòu)建 Web 應(yīng)用程序的 MVC 實(shí)現(xiàn)。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術(shù),其中包括 JSP、Velocity、Tiles、iText和POI
其中最為重要的就是Spring Core(控制反轉(zhuǎn)技術(shù),即IOC)和 Spring AOP,我會(huì)在后續(xù)的文章中進(jìn)行詳細(xì)介紹,今天我們來重點(diǎn)講解Spring的環(huán)境搭建和Hello Spring Demo的編寫。
環(huán)境搭建
最簡單的方式,創(chuàng)建一個(gè)maven工程,pom.xml如下
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>5.2.5.RELEASE</version>
- </dependency>
Spring 中的Bean
Spring容器可以被看作一個(gè)大工廠,而 Spring 容器中的 Bean 就相當(dāng)于該工廠的產(chǎn)品。如果希望這個(gè)大工廠能夠生產(chǎn)和管理 Bean,這時(shí)則需要告訴容器需要哪些 Bean,以及需要以何種方式將這些 Bean 裝配到一起。
Bean 是一種JAVA語言寫成的可重用組件。為寫成JavaBean,類必須是具體的和公共的,并且具有無參數(shù)的構(gòu)造器。JavaBean 通過提供符合一致性設(shè)計(jì)模式的公共方法將內(nèi)部域暴露成員屬性,set和get方法獲取??傊?,JavaBean就是遵循一些規(guī)范的Java類。眾所周知,屬性名稱符合這種模式,其他Java 類可以通過反射機(jī)制發(fā)現(xiàn)和操作這些JavaBean 的屬性。
范例代碼如下:
- public class Person {
- //Person類封裝的私有屬性
- // 姓名 String類型
- private String name;
- // 性別 String類型
- private String sex;
- // 年齡int類型
- private int age;
- //Person類的無參數(shù)構(gòu)造方法
- public Person() {
- }
- //Person類對(duì)外提供的用于訪問私有屬性的public方法
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
Spring中的配置文件
Spring配置文件是用于指導(dǎo)Spring工廠進(jìn)行Bean生產(chǎn)、依賴關(guān)系注入(裝配)及Bean實(shí)例分發(fā)的"圖紙"。Spring配置文件是一個(gè)或多個(gè)標(biāo)準(zhǔn)的XML文檔,applicationContext.xml(也可以定義為其他名字)是Spring的默認(rèn)配置文件,當(dāng)容器啟動(dòng)時(shí)找不到指定的配置文檔時(shí),將會(huì)嘗試加載這個(gè)默認(rèn)的配置文件。我們可以把配置文件保存在src/main/resources目錄下

Spring配置文件支持兩種不同的格式,分別是 XML 文件格式和 Properties 文件格式。通常情況下,Spring 會(huì)以 XML 文件格式作為Spring 的配置文件,這種配置方式通過 XML 文件注冊(cè)并管理 Bean 之間的依賴關(guān)系。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"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- https://www.springframework.org/schema/beans/spring-beans.xsd">
- <bean id="..." class="...">
- </bean>
- <bean id="..." class="...">
- <property name=" ..." value="..."/>
- </beans>
其中
xmlns表示xml需要引入的命名空間。
bean= 對(duì)象
id= 變量名,id 是bean的標(biāo)識(shí)符,要唯一,可以理解為一個(gè)實(shí)例名
class= new的類
property相當(dāng)于給對(duì)象中的屬性設(shè)值
Hello Spring
寫一個(gè)類代碼
- public class HelloSpring {
- private String name="hello";
- HelloSpring(){
- System.out.println("Hello Spring");
- }
- public String getName() {
- return this.name ;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
在配置文件中添加HelloSpring的類配置信息
- <?xmlversion="1.0"encoding="UTF-8"?>
- <beansxmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- https://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- https://www.springframework.org/schema/context/spring-context.xsd">
- <beanid="hellospring"class="com.my.demo.HelloSpring"/>
- </beans>
寫一個(gè)測(cè)試類
- public class HelloTest {
- public static void main(String[] args) {
- //獲取spring上下文對(duì)象
- ApplicationContextcontext = new ClassPathXmlApplicationContext("beans1.xml");
- //我們的對(duì)象能在都在spring中管理了,我們要使用,直接取出來就可以了
- HelloSpringhello = (HelloSpring) context.getBean("hellospring");
- System.out.println(hello.getName());
- }
- }
運(yùn)行類HelloTest,運(yùn)行結(jié)果如下:
- Hello Spring //構(gòu)造函數(shù)中輸出的值
- Hello //getName方法中輸出的值
是不是很神奇,我們可以看到spring并沒有new 實(shí)例的過程,但是完成了實(shí)例化的操作!并成功調(diào)用了getName方法,這就是Spring 容器中對(duì)Bean的管理,簡單的說,就是Spring框架從配置文件beans1.xml中獲取了類HelloSpring的實(shí)例hellospring,并自動(dòng)完成了實(shí)例化的相關(guān)工作!這項(xiàng)技術(shù)就是IOC,我會(huì)在下一篇文章中詳細(xì)說明。