1. 程式人生 > >初識Spring Framework

初識Spring Framework

最近在工作用到了Spring框架,由於以前沒有接觸過Spring,就從Spring的官方文件開始學起。在“Quick Start”介紹了一個使用Spring做依賴性注入(dependency injection)的例子,該例子使用Maven或GRADlE進行管理的。作者以前沒有接觸過這兩個專案管理工具,由於時間緊迫,就直接使用了Eclipse編譯了這個例子。在Eclipse下的檔案結構如下:



(由於沒有使用專案管理工具,剛開始只加入了spring-context.jar和spring-core.jar,又根據異常資訊匯入了commouns-logging.jar、spring-expression.jar和spring-beans.jar。這就是不是專案管理工具的麻煩所在。)

hello/MessageService.java的程式碼如下:

package hello;

public interface MessageService {
    String getMessage();
}
hello/MessagePrinter.java的程式碼如下:
package hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MessagePrinter {

    final private MessageService service;

    @Autowired
    public MessagePrinter(MessageService service) {
        this.service = service;
    }

    public void printMessage() {
        System.out.println(this.service.getMessage());
    }
}

hello/App.java的程式碼如下:
package hello;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
public class App {

    @Bean
    MessageService mockMessageService() {
        return new MessageService() {
            public String getMessage() {
              return "Hello World!";
            }
        };
    }

  public static void main(String[] args) {
      ApplicationContext context = 
          new AnnotationConfigApplicationContext(App.class);
      MessagePrinter printer = context.getBean(MessagePrinter.class);
      printer.printMessage();
  }
}

編譯執行該專案,會有以下輸出:



“Quick Start”最後總結說這個充分體現了依賴性注入(dependency injection)的概念,至於如何體現的作者嘗試做一下解析,權當對Spring Framework的一個初步認識。

專案的入口是App.java的main函式,在這個函式中首先聲明瞭一個ApplicationContext物件context,並向下轉型為AnnotationConfigApplicationContext物件。ApplicationContext是對一個應用(Application)提供配置的核心介面,AnnotationConfigApplicationContext是它的一個實現,可用來處理用@Configuration,@Component和JSR-330標註的類。由於App.java使用@Configuration進行了標註,故App.class可以作為AnnotationConfigApplicationContext構造器的的引數。

 MessagePrinter printer = context.getBean(MessagePrinter.class);
這句程式碼通過context的getBean(Class<T>)方法得到了MessagePrinter的一個例項。為什麼呢得到MessagePrinter類的一個例項呢?看getBean(Class<T>)的API解釋:

Return the bean instance that uniquely matches the given object type, if any.

(如果給定的物件唯一匹配,就返回一個bean例項。)

 printer.printMessage();
呼叫MessagePrinter的printMessage()方法,該方法如下實現:
 public void printMessage() {
        System.out.println(this.service.getMessage());
    }
其實是呼叫了介面MessageService的getMessage()方法,由於App.java中的mockMessageService()方法中的匿名內部類實現了MessageService介面,並在getMessage()方法中返回了“hello,world!”字串,顧能在結果中輸出"hello,world!"。

令人迷惑的是在mockMessageService()方法並沒有被顯式呼叫,為何其匿名內部類能被例項化並輸出資訊呢?原因就在於程式中使用的以下Spring標註。

@Configuration 用於標註一個類,表示bean定義的原始檔(source);

@Bean 用於標註一個方法,表示一個方法例項化、配置或初始化一個新的物件(Object),這個物件被Spring的控制反轉(IoC)容器管理,相當於Spring <bean />XML配置檔案中<bean />元素。(詳見官方文件

@ComponentScan  用於標註一個類,表示掃描指定包中的@Component標註的類,並將這些類註冊為Spring IoC容器的bean,亦相當於一個<bean />元素;

@Autowired  用於標註setter方法,構造器,包含多個引數的方法,集合等等,用於自動繫結;

@Component  用於標註一個類

由於MessagePrinter中有如下構造器:

  @Autowired
    public MessagePrinter(MessageService service) {
        this.service = service;
    }
從這個構造器中可以到MessagePrinter依賴MessgeServie,並用@Autowired標註。這就表示在通過contexnt.getBean(MessagePrinter.class)得到MessagePrinter的一個例項時,會將對MessageService的依賴自動繫結到MessageService類,將查詢所有能作為<bean />元素的類(@Component @Configuration標註)或方法(@Bean標註),而在App.java中有如下方法:
 @Bean
    MessageService mockMessageService() {
        return new MessageService() {
            public String getMessage() {
              return "Hello World!";
            }
        };
    }
查詢到這個方法後會將這個MessageService實現注入到MessagePrinter例項中,從而實現“hello,world!”的輸出。

以上就是作者對Spring Framework文件“Quick Start”例子的解析,有不當之處=請多多指教。

相關推薦

初識Spring Framework

最近在工作用到了Spring框架,由於以前沒有接觸過Spring,就從Spring的官方文件開始學起。在“Quick Start”介紹了一個使用Spring做依賴性注入(dependency injection)的例子,該例子使用Maven或GRADlE進行管理的。作者以前

Spring Framework 初識

servlet assets 註入 語言 註解 .cn mvc設計模式 aop lis Spring Framework Spring Framework 提供了一種綜合的企業級應用的開發配置模型。 特性: 核心技術:依賴註入、事件、資源管理、國際化、數據校驗、數據綁定、

spring framework體系結構及內部各模塊jar之間的maven依賴關系

都在 pen 構圖 功能 sock 編譯 pla core cat 很多人都在用spring開發java項目,但是配置maven依賴的時候並不能明確要配置哪些spring的jar,經常是胡亂添加一堆,編譯或運行報錯就繼續配置jar依賴,導致spring依賴混亂,甚至下一次創

Spring-Framework 源碼閱讀之AnnotationBeanUtils

哈哈 dex hold object pla efi str method 一點   Java程序員,就是要學會一個名字叫做“春”的東西,這玩意運用的非常的廣泛,現在如果你的業務系統或者軟件沒有在這個東西上開發,都不要意思拿出來。因為你更不上時代了。在平時的工作的中基本都是

Spring Framework基礎學習

正常 應用程序 指南 actor 行為 contex modules all es2017 Spring Framework基礎學習 Core support for dependency injection,transaction management,web ap

初識Spring MVC

osi 動態 handle -a 執行 ans art 架構 一個 一、spring MVC 簡介 1. Spring MVC也叫Spring Web mvc,屬於表現層的框架。Spring MVC是spring框架的一部分,是在Spring3.0後發布的。 2.spri

Spring Framework

好處 gpo 組件 產生 work 對組 div 服務 自身 1、容器及其管理的組件所提供的最重要的好處就是可拔插的體系結構。 2、控制反轉:在組件類中,不需要使用新的操作符(一般為new)來實例化依賴組件, 而是在運行時由容器實例將依賴組件(A)註入組件(B)-->

[自編號1-2]將spring framework源碼導入Spring Tool Suite中

4.0 1.8 比較 簡單 成了 valid 問題 wildcard declare 先講基本步驟,如下: 去GitHub中下載spring framework的源碼,https://github.com/spring-projects/spring-framework/

Spring-framework 源碼導入 IntelliJ IDEA 記錄

struct 自己 gin users group 技術 import 1.8 tar 前言   想學習spring框架,不看源碼怎麽行。網上有很多教程,但是自己實施起來還是稍微有點坎坷的,不過最後還是成功了。遂以此文記錄。   環境說明:   Idea 2017.2.5

初識Spring Boot

web for 控制臺 plugins dem isp .so 新特性 ide 概述     簡單的介紹了Spring Boot的特性以及如何搭建一個Spring Boot項目。 什麽是Spring Boot     隨著動態語言的流行,Java的開發顯得格外的

1.Spring Framework 入門篇

模塊化設計 ima 幫助 jar包 p s bstr pin int support 0x00為什麽學習Spring 隨著對Java EE的不斷接觸和理解,你會發現Spring MVC 在各個企業和項目中發揮著越來越重要的作用。掌握Spring MVC 已成為我們IT行業

Spring Framework: @RestController vs @Controller

guid gui resp anti ram html nes AC .com https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/ann

Spring Framework及SpringMVC源碼閱讀1

eth factor enable rabl 端口 determine state web應用 屬性 web應用的啟動過程 熟悉的web應用都帶有一個web.xml配置文件,web應用的啟動就是從這個web.xml開始的。web應用放入servlet容器如tomcat中,

Spring學習,初識Spring

rgs png ice hello pri ssa 解耦合 cat orm Spring概述 將Spring理解為管理對象間依賴關系的容器 “解耦” 根據功能的不同,可以將一個系統中的代碼分為 主業務邏輯 與 系統級業務邏輯 兩類 ```Spring 是為了解決企業級開發的

Spring Framework 5 中的新特性

jpg 幹凈 map 避免 strong findbugs ora htm 習慣 Spring Framework 5 中的新特性 Spring 5 如何利用 Java 8 的函數式語法和一種新的反應式編程模型 Alex Theedom2017 年 10 月 18 日

JavaIOC框架篇之Spring Framework

rap rep ofo path 正在 xmlns encoding 相關 ron 歡迎查看Java開發之上帝之眼系列教程,如果您正在為Java後端龐大的體系所困擾,如果您正在為各種繁出不窮的技術和各種框架所迷茫,那麽本系列文章將帶您窺探Java龐大的體系。本系列教程希望您

Spring Framework啟動詳解

service 控制 ice trap pri pos warn 層次結構 initial 之前一直對Spring啟動的過程很迷糊,所以這次國慶梳理一下。 Spring啟動一言以蔽之:創建一個根應用上下文。(因為其他的所有的應用上下文都可以通過各種方式繼承它) (一)了

初識 spring-mvc

spring-mvc 介紹 Spring-mvc 屬於表現層的框架,他是Spring 框架的一部分,作用就是controller(控制層) spring mvc 的執過程: 客服端傳送請求 dispacherServlet 把相應的結果請求給

Spring Framework 4.2.x - Eclipse/STS專案匯入指南

Spring Framework - Eclipse/STS專案匯入指南 本文件將指導您把"Spring Framework"專案匯入到Eclipse或STS中。 建議您使用最近版本的Eclipse或STS。作為最低限度,Eclipse中需要具備以下功能:完整的Java 8支援、Aspect

初識spring data mongodb

話不多說上demo:         首選配置檔案,主要是連線mongodb資料庫使用: application.properties spring.data.mongodb.host=127.0.0.1 spring.data.mongodb.p