一年多前,我開始了Java Web學習之旅。這個旅程是斷斷續續的,由於它與個人工做領域沒有太多重合。最近看了不少Java和Spring的資料,然而離感受本身學會了,仍有一點距離。所以,就繼續以前的Servlet和JSP博客系列吧。html
本系列將會覆蓋到Spring的基礎以及Spring MVC, 固然還有Spring Boot. 除了開始介紹 Spring及其配置的文章,後面將都使用 Spring Boot。spring
同時,本系列將不是照本宣科的學習,還會有一些思考和討論。不然,很容易陷入一堆配置的泥潭,越學越糊塗。作好準備,咱們開始吧!數據庫
本段內容引自這裏, 很棒的博客!編程
Spring框架由Rod Johnson開發,初版於2004年發佈。Spring是一個從實際開發中抽取出來的框架,所以它完成了大量開發中的通用步驟,留給開發者的僅僅是與特定應用相關的部分,從而大大提升了企業應用的開發效率。設計模式
Spring總結起來優勢以下:安全
Spring的歷史很少談,但提到Spring,必定會提到它的核心容器。你可能還聽過另外一個詞:IoC,控制反轉。這個詞顯然更加不知所云。
IoC是更早提出的概念,它是OO設計模式的一種。而在IoC以前,還有個設計原則,叫依賴倒置原則(DIP)。服務器
依賴倒置原則:高層模塊不該該依賴低層模塊,而兩個都應該依賴抽象。抽象不該該依賴於細節,細節應該依賴於抽象。
關於它們的前世此生,這篇文章講的很是好。session
總結起來就是:框架
顯然,對於Java Web來講,使用Spring容器別無選擇。以致於會讓一些人認爲這是天經地義的。然而放眼其餘語言,幾乎都有各自的容器框架,卻不多有像Spring這樣獲得了廣泛的應用。甚至,在咱們公司的.NET開發規範中,明確指出了Unity這種容器框架太重,不推薦使用。如下是一些討論(在討論以前,咱們先明確一點 —— IoC 不等於 IoC容器):函數
而使用容器的缺點也顯而易見,現在處處都是Annotation,根本不是集中配置。須要記住的約定一大堆,出了問題還要排查是否是Spring注入的錯。在代碼中定位依賴也一樣很不直觀。
如下是網上的一些討論,並不是爲了撕,只是提供更全面的認識。
知乎
水木社區
最後,既來之則安之,下面咱們正式開始。
JavaBean、EJB、POJO這些東西又有不少歷史能夠扯。具體參見這裏。結論就是,在Spring容器裏,Bean就是POJO。也就是說:
Spring經過應用上下文(Application Context)來行使容器的工做。Spring自帶了多種類型的應用上下文實現,每種都以具體的類表示。下面是經常使用的幾個:
AnnotationConfigApplicationContext
:從Java配置類中加載Spring應用上下文。AnnotationConfigWebApplicationContext
:從Java配置類中加載Spring Web應用上下文。ClassPathXmlApplicationContext
:從ClassPath下的XML配置文件中加載Spring應用上下文。FileSystemXmlApplicationContext
:從文件系統的XML配置文件中加載Spring應用上下文。XmlWebApplicationContext
:從Web應用中的XML配置文件中加載Spring Web應用上下文。既然是入口類,使用它們只有一種方式:直接或間接地new出一個實例。以下是一個簡單的例子:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); User u = (User)context.getBean("user"); System.out.println(u);
Spring的配置方案隨着歷史的演進,支持如下三種:
XML配置是最老的技術;使用Java類配置是最新的推薦。而自動掃描和自動裝配使用XML和Java均可以指定。
@Configuration
註解建立配置類。@Bean
註解聲明Bean。所謂裝配(wiring)就是指建立所依賴的對象的行爲,即依賴注入。自動裝配就是容器推斷出所依賴的具體對象,建立它並設置好使用類。
組件掃描則是指Spring能夠掃描應用中有特殊註解的類,爲其建立Bean。
@Component
註解標記可被發現的類。當介紹到Spring Web部分時,咱們還會看到其餘幾個類似的註解。@ComponentScan
註解啓用組件掃描。@Autowired
註解開啓自動裝配。另外Spring也重用了JDK中的@Resource
註解。二者有微小的差別。使用Java Config能作到的在XML中也能作到。例如:
<bean class="xxx"/>
聲明bean。<context:component-scan base-package="yyy"/>
啓用組件掃描。<bean autowire="true"/>
開啓自動裝配。當經過Spring容器建立一個Bean實例時,不只能夠完成Bean實例的實例化,還能夠爲Bean指定特定的做用域。Spring支持以下五種做用域:
getBean()
方法獲取prototype做用域的Bean時,都將產生一個新的Bean實例。若是不指定Bean的做用域,Spring默認使用Singleton做用域。Prototype做用域的Bean的建立、銷燬代價比較大。而Singleton做用域的Bean實例一旦建立成功,就能夠重複使用。所以,應該儘可能避免將Bean設置成Prototype做用域。