Spring 實戰 第一章 spring之旅

培訓出身,非科班,全憑自己濃厚的興趣成爲一名java軟件開發工程師,畢業後工作兩年,自以爲springmvc springboot等玩的很6了,前陣子面試後才讓我知道,需要看書了。不然看到的時候懂,問到的時候不懂。記得面試官問了一個很搞笑的問題,http的2x 3x 4x 5x是代表什麼意思?嗯,我懵逼了。最後我才忍不住問了,才知道其實就是請求狀態碼 200 400.......好了 廢話不多說了。

 

本章內容:

  • spring的bean容器

  • 介紹spring的核心模塊

  • 更爲強大的spring生態系統

  • spring的新功能

 

1.1 spring的bean容器

    spring最根本的使命:簡化java開發

    爲了降低java開發的複雜性,spring採取了一下四種關鍵策略:

  • 基於POJO的輕量級和最小侵入性編程

  • 通過依賴注入和麪向接口實現鬆耦合

  • 基於切面和慣例進行聲明式編程

  • 通過切面和模板減少樣板式代碼

開發過程中經常會遇到POJO和javabean這兩個詞,書上提到,POJO:一個簡單普通的java類。但二者到底什麼區別?很多人一知半解。

以下解釋來自:

大白話講解POJO與JavaBean

POJO 就好比是一個普通自行車,而 JavaBean 就好比是一個電動自行車(特殊的自行車)。普通自行車擁有輪子,而電動自行車也有輪子,但是電動自行車有了電瓶,才能稱爲是電動自行車。它倆的區別就在於本質上的不同,一個帶電瓶,一個不帶電瓶,雖然它倆都可以表示爲自行車,但因爲本質上的不同,帶電的能稱爲是電動自行車,而不帶電的只能稱爲普通自行車。在 Java 中,POJO 是一個普通的 Java對象,而 JavaBean 卻是一個特殊的 Java對象,這個特殊的 Java對象具有一定的標準才能稱爲 JavaBean。也就是說,萬物皆對象,即POJO,其中,滿足特殊條件和規範的就成爲javabean。下面我們就結合 Java 近距離看 POJO 與 JavaBean。

POJO 是 Plain Ordinary Java Object 的縮寫,意思是 簡單普通的 Java對象,它的特徵是:

1、擁有一些 private修飾的屬性;

2、這些 private修飾的屬性都提供 get…()&set…() 方法。

我們把這樣的類稱爲 POJO類,POJO類 實例化出來的對象稱爲 POJO對象。下面是一個 POJO類的例子:

// 自行車
public class Bike {
    private String wheel;   // 輪子
    // set...() & get...()
    public String getWheel() {
        return wheel;
    }
    public void setWheel(String wheel) {
        this.wheel = wheel;
    }
}

JavaBean 從字面上來看,它有咖啡豆的含義,關於 Java 這個名字由來的故事相信大家都聽說過,它的名字是和印度尼西亞爪哇島上爪哇咖啡有關,在 Java中也有很多類和方法的名字都和咖啡有着密不可分的聯繫,就連 JavaBean 也有咖啡豆的含義,寓意着它是 Java中重要的組成部分,它也必須符合一些特定的標準纔可稱爲 JavaBean,它的特徵是:

1、所有的屬性都被 private修飾;

2、這個類必須有一個無參構造器;

3、所有的屬性必須都提供 get…()&set…() 方法;

4、這個類必須是可序列化的,實現 serializable 接口。

我們把符合這樣特徵的類稱爲 JavaBean類,JavaBean類 實例化出來的對象稱爲 JavaBean對象。下面是一個 JavaBean類的例子:
 

// 電動車
public class Ebike implements serializable {
    private String wheel;    // 輪子
    // 無參構造器
    public Ebike() {}
    // set...() & get...()
    public String getWheel() {
        return wheel;
    }
    public void setWheel(String wheel) {
        this.wheel = wheel;
    }
}

這個時候,序列化這個詞相信很多人也很熟悉。具體什麼作用?爲什麼要序列化?

       把對象轉換爲字節序列的過程稱爲對象的序列化
  把字節序列恢復爲對象的過程稱爲對象的反序列化
  對象的序列化主要有兩種用途:
  1) 把對象的字節序列永久地保存到硬盤上,通常存放在一個文件中;
  2) 在網絡上傳送對象的字節序列。

  在很多應用中,需要對某些對象進行序列化,讓它們離開內存空間,入住物理硬盤,以便長期保存。比如最常見的是Web服務器中的Session對象,當有 10萬用戶併發訪問,就有可能出現10萬個Session對象,內存可能吃不消,於是Web容器就會把一些seesion先序列化到硬盤中,等要用了,再把保存在硬盤中的對象還原到內存中。

更詳細內容有興趣的可以看這篇文章:Java基礎學習總結——Java對象的序列化和反序列化

想要更深入瞭解的話就看這個:深入理解JAVA I/O系列五:對象序列化

 

稍微拓展瞭解了之後,好了,迴歸正題,這些java類---POJO形式上雖然看起來很簡單,但spring一樣可以讓它賦予魔力,方式之一就是通過DI來裝配它們。DI----依賴注入。通過DI,對象的依賴關係將由系統中負責協調各對象的第三方組件在創建對象的時候進行設定。對象無需自行創建或管理它們的依賴關係。依賴關係將自動注入到需要它們的對象當中去。常用的方式就是構造器注入。將一個對象作爲另外一個對象的構造器參數注入的方式。

創建應用組件之間協作的行爲通常被稱爲裝配(wiring)。spring有多種裝配bean的方式,採用XML是很常見的。比如:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="https://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd"

<bean id="knight" class="com.springinaction.knights.BraveKnight">
    <constructor-arg ref="quest" />
</bean>

<bean id="quest" class="com.springinaction.knights.SlayDragonQuest">
    <constructor-arg value="#{T(System).out} />
</bean>

</beans>

在這裏,BraveKnight和SlayDragonQuest被聲明爲Spring中的bean。就BraveKnight bean來講,它在構造時傳入了對SlayDragonQuest bean的引用,將其作爲構造器參數。同時,SlayDragonQuest bean的聲明使用了Spring表達式語言(Spring Expression Language),將System.out(這是一個PrintStream)傳入到了SlayDragonQuest的構造器中。

如果XML配置不符合你的喜好,spring還支持使用java來描述配置。

import com.springframework.content.annotation.Configuration;

@Configuration
public class KnightConfig{

    @Bean
    public Knight knight(){
        return new BraveKnight(quest());
    }

    @Bean
    public Quest quest(){
        return new SlayDragonQuest(System.out);
    }

}

spring通過應用上下文(Application Context)裝載bean、的定義並把它們組裝起來。Spring應用上下文全權負責對象的創建和組裝。

 

                               ==========================================================

DI能夠讓相互協作的軟件組件保持鬆散耦合。而面向切面編程(AOP)可以把遍佈應用各處的功能分離出來形成可重用的組件。

                               ===========================================================

程序可以理解爲一個圓,AOP就是在這個圓外圍的同心圓,程序運行時從左到右穿過兩個圓。要將一個類抽象爲一個切面,可以在spring配置文件中聲明它。

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="https://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd"

<bean id="knight" class="com.springinaction.knights.BraveKnight">
    <constructor-arg ref="quest" />
</bean>

<bean id="quest" class="com.springinaction.knights.SlayDragonQuest">
    <constructor-arg value="#{T(System).out} />
</bean>


<bean id="minstrel" class="com.springinaction.knights.Minstrel">
    <constructor-arg value="#{T(System).out} />
</bean>

<aop:config>
    <aop:aspect ref ="minstrel">
        <aop:pointcut id="embard"> expression="execution(* *.embarkOnQuest(..))" />
        <aop:before pointcut-ref="embark" method="singBeforeQuest" />

        <aop:after pointcut-ref="embark" method="singBeforeQuest" />
    </aop:aspect>
</aop:config>


</beans>

1.2 容納你的bean

1.2.1使用應用上下文

  •  AnnotationConfigApplicationContext:從一個或多個基於java的配置類中加載Spring應用上下文
  • AnnotaionConfigWebApplicationContext:從一個或多個基於java的配置類中加載Spring Web 應用上下文
  • ClassPathXmlApplicationContext:從類路徑下的一個或多個xml配置文件中加載上下文定義,把應用上下文的定義文件作爲類資源
  • FileSystemXmlApplicationContext:從文件系統下的一個或多個xml配置文件中加載上下文定義
  • XmlWebApplicationContext:從web應用下的一個或多個xml配置文件中加載上下文定義

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章