Java Web系列:Spring依賴注入基礎

2021-01-11 CSDN

一、Spring簡介

1.Spring簡化Java開發

Spring Framework是一個應用框架,框架一般是半成品,我們在框架的基礎上可以不用每個項目自己實現架構、基礎設施和常用功能性組件,而是可以專注業務邏輯。因此學習Spring Framework在架構和模式方面的結構和原理,對我們在架構和模塊級別的理解幫助極大。Spring Framework(參考1)的宗旨是簡化Java開發,主要的手段如下:

(1)在架構上解耦:通過DI(依賴注入)管理類型依賴,通過AOP分離關注點,減少重複代碼。

(2)在設計上廣泛採用DIP(依賴倒置)和ISP(接口隔離)等原則和Facade(外觀)等模式:提供簡化的調用接口並封裝了眾多出色的第三方組件。

(3)在語言層面上採用註解:通過配置文件和Annotation(參考.NET Attribute)簡化應用配置。

2.Spring Framework的架構和模塊:

Spring Framework本身的架構是典型的鬆散分層,外層可以按需引用全部內層,內層不能引用外層。Spring的基礎組件如下圖所示:

從圖中可以看出,開始的模塊只有從core\beans\aop\context四個組件,後來添加了context-support【1.2】擴展模塊、expression【3.0】擴展模塊和beans-groovy【4.0】擴展模塊。

Spring上述模塊的基礎上,內建和封裝了眾多的實用的通用組件,主要的組件如圖所示:

從圖中可以看出,spring-oxm、spring-jdbc和spring-web是眾多模塊依賴的核心,spring-oxm提供了Object和XML的映射支持。

二、基礎知識

1.DIP:DIP(依賴倒置原則)是DI(依賴注入)的核心(參考2)。

(1)高層模塊不應該依賴於低層模塊。兩者都應該依賴於抽象。

(2)抽象不應該依賴於細節。細節應該依賴於抽象。

說人話就是:將對具體類的引用轉換成對其接口的引用,具體類只引用接口(引用==依賴,接口==接口或抽象類)。事實上我們調用具體類的時候在頭腦裡也是只關心其提供的API而非實現,DIP則通過在設計和重構階段在技術手段上保證了解耦。

2.DI:DI(依賴注入)讓我們不必手寫工廠代碼來管理接口和實現類的映射、對象的創建和生命周期的管理。

(1)接口注入:必須實現特定的接口才可以,侵入性太強,現在已經無人關心和使用。

(2)構造函數注入:依賴體現在構造函數的參數上。

(3)屬性注入:依賴體現在屬性上。

由於在實現時,可以將類型註冊為自己的兼容類型,這樣依賴注入就可以直接替代new實例化對象,這樣理解和使用依賴注入工具還不如不使用或手寫工廠了。依賴注入工具在實現時肯定會實現成一個支持不同配置和不同生命周期的對象工廠,但即使沒有提供一套添加依賴倒置原則限制的API,也不意味著我們把它當成new的替代品。如同映射工具雖然在實現時可以任意映射,但不是用來取代賦值的,而是用來處理領域實體和視圖模型等有實際對應關係的對象之間的映射。

(1)依賴配置:依賴配置是依賴注入實現的基礎。依賴注入工具都至少支持代碼配置和文件配置。Java中可以通過Annotation(.NET中通過Attribute)簡化配置。

(2)對象工廠:根據配置返回一個或多個對象。這是核心功能。

(3)生命周期管理:一般提供至少4種級別的支持:作用域、單例、線程、HTTP請求範圍。

大多數依賴注入工具在支持依賴倒置原則的基礎上,在技術手段上實現了更多的功能,如類型的兼容轉換、對依賴命名、在配置時直接傳入對象等。

三、Spring依賴注入的要點

Bean在Spring中就是POJO(.NET的POCO)。

Spring依賴注入需要掌握的核心是3個類型BeanDefinition、BeanFactory和ApplicationContext。

1.BeanFactory

BeanFactory是spring中依賴注入的核心接口,其設計主要採用了ISP(接口隔離原則),通過多層次的接口繼承即保證了單個接口的內聚又保證了整個體系的簡潔。這裡我們要關注的核心是DefaultListableBeanFactory。

如圖所示,查看XmlBeanFactory代碼,可以看到XmlBeanFactory只是通過XmlBeanDefinitionReader載入了BeanDefinition配置,XmlBeanDefinitionReader負責將配置解析到BeanDefinition。DefaultListableBeanFactory是真正的實現類,其中定義了類型為Map

相關焦點

  • Java Web系列:Spring MVC基礎
    ;import org.springframework.validation.BindingResult;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod
  • 五分鐘學Java:一篇文章搞懂spring和springMVC
    首先,先來看看spring基礎部分應該如何學習。,而是簡單地完成bean聲明和注入依賴就可以了。假如沒有spring的IOC,我們管理實例時可能很不方便,比如下面這段代碼,我們必須要在構造方法裡對userService和bookservice進行實例化,並且注入相應的依賴,否則它自己是沒有辦法完成初始化的。甚至,我們在使用controller的時候還要自己對它進行實例化。
  • Java經典面試題Spring是什麼 Spring框架入門詳解
    接下來我們看一下spring另一個特性,DI依賴注入是什麼。上面Java代碼中的username,userage都是由我手動設置的,但是這樣實在太過於麻煩,於是Spring提供了為對象屬性注入的功能。下面回到剛才xml中的userBean部分創建property字標籤,name為pojo中需要注入的變量名,value就是需要注入的值,結果顯示已經注入成功了。那麼spring是否能夠完成我們自定義java對象的注入呢?
  • Java程式設計師必會SpringMVC框架入門 b/s架構精講0基礎也能看懂
    下面我們通過maven來下載SpringMVC所依賴的核心包。spring-web包是spring對web環境的支持,包含了對Http協議與對core包在web方向擴充及部分工具類。到這裡依賴的基本jar包已經下載完畢了,我們只需要在maven中下載三個jar包,spring-web和spring-webmvc和jstl,其他的包maven會自動下載。接下來我們需要對web.xml進行配置,它是基於servlet的web項目核心配置文件。
  • 五分鐘學Java:如何掌握Java Web裡這麼多的技術?
    讓我們先看看百度百科對於Java Web的定義,Java Web,是用Java技術來解決相關web網際網路領域的技術合集。web包括:web伺服器和web客戶端兩部分。Java在客戶端的應用有java applet,不過使用得很少,Java在伺服器端的應用非常的豐富,比如Servlet,JSP和第三方框架等等。
  • 通過Idea創建Spring Boot java項目
    寫在前面,每個java程序開發,需要準備好相應的開發工具和java運行環境。接下來選擇Spring Boot版本,2.24,配置項目的依賴(項目依賴就是項目運行過程中,需要用到的第三方jar包資源)的選擇界面,左邊選擇Web,右邊選擇Spring Web。點擊Next進入下一步。最後一步,點擊Finish,完成程序的創建。創建成功後的項目。
  • Spring Boot中使用Mockito進行Web測試 - 第339篇
    Spring Boot系列之三2020上半年發文匯總「值得收藏」Slf4j的前世今生之java日誌框架演化歷史 - 第334篇SpringBoot框架開發的優秀的項目「值得收藏學習」 - 第335從Spring整合第三方框架學習Spring Boot - 第336篇Mock工具之Mockito - 第337篇
  • spring微服務中的那點事
    Inversion of Control 和 Dependency Injection 的基本思想就是把類的依賴從類內部轉化到外部以減少依賴。 應用Inversion of Control,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用,傳遞給它。也可以說,依賴被注入到對象中。
  • 2021 最新版 Spring Boot 速記教程
    SpringBoot 基礎配置Spring Boot Starters引用自參考資料 1 描述:「starter的理念:starter 會把所有用到的依賴都給包含進來,避免了開發者自己去引入依賴所帶來的麻煩。
  • Java程式設計師必會 springmvc-spring-mybatis框架整合搭建傻瓜教程
    ssm是用於將springmvc-spring-mybatis三個框架整合來進行java開發web項目。本文通過ssm三大框架整合的形式講解springmvc的使用教程,最新的框架版本主流IDE,只要按照圖中步驟能夠保證每個人的框架搭建完成並成功運行。這裡使用maven來構建項目,我們需要創建一個名為ssm的maven項目,打包方式為war包。
  • 好書一起讀(92):我的Java Web書單
    《jquery技術內幕》與《struts2技術內幕》《spring技術內幕》一系列的好書,講源碼的。這三本書都值得一看。但注意「源碼無用論」和「源碼神聖論」都不可取。《深入淺出extjs》可能是extjs唯一的一本可讀的書。非常不喜歡這個框架的思想。html和css都喪失了權力一切由它來託管了,未免權力欲過於旺盛。
  • 漫畫 | Spring Framework
    項目中,classpath通常指src根路徑下Web項目中實例化方式在Web伺服器中加入以下實例化代碼,通常是位於web.xml文件中,即項目啟動便實例化容器<!—指定以ContextLoaderListener方式啟動Spring容器 -->  <listener>    <listener-class>      org.springframework.web.context.ContextLoaderListener    </listener-class></listener
  • SpringMVC(Web應用)配置教程終章--項目實戰
    本章是SpringMVC(Web應用)配置教程系列的最後一章了,感謝大家一路陪伴,一起成長。;import java.util.List;@Servicepublic class TestServiceImpl implements TestService {    public List<test_info> selectAllTestInfo() { return null; }}注入我們的數據源Mapper,將其傳遞給ServiceImpl
  • Spring Cloud-Hystrix 斷路器
    Hystrix提供了熔斷、隔離、Fallback、cache、監控等功能,能夠在一個、或多個依賴同時出現問題時保證系統依然可用。;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;/*** @author hzk* @date 2018/5/13*/@RestControllerpublic class OrderController {//spring
  • Spring 和 Spring Boot 之間到底有啥區別?
    什麼是Spring作為 Java開發人員,大家都 Spring都不陌生,簡而言之, Spring框架為開發 Java應用程式提供了全面的基礎架構支持。它包含一些很好的功能,如依賴注入和開箱即用的模塊,如:SpringJDBC、SpringMVC、SpringSecurity、SpringAOP、SpringORM、SpringTest,這些模塊縮短應用程式的開發時間,提高了應用開發的效率例如,在 JavaWeb開發的早期階段,我們需要編寫大量的代碼來將記錄插入到資料庫中。
  • springboot+springsecurity實現前後端分離簡單實現!
    簡單理解: 自定義配置登錄成功、登陸失敗、註銷成功目標結果類,並將其注入到springsecurity的配置文件中。--springboot集成web操作7--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web
  • Dagger2讓你愛不釋手-基礎依賴注入框架篇
    前言dagger2的大名我想大家都已經很熟了,它是解決Android或java中依賴注入的一個類庫(DI類庫)。其次java註解的概念用法我們就不講了,dagger2中核心點就是java註解,點擊我可以了解更多java註解知識文中超鏈可複製最下面連結查看。
  • 最受歡迎的 Java Web 開發框架盤點
    Java開發框架排名列前3名,包括以下: 1) Spring網址:http://projects.spring.io/spring-framework/ 2) JSF網址:http://www.oracle.com/technetwork/java/javaee/download-139288
  • 【Java開發必看】Spring基礎知識匯總
    本文非常詳細的介紹了Spring,如果你正想了解Spring,那麼這篇文章值得仔細閱讀(ps.本文適合有一定基礎的java學習者
  • 學習學習SpringSecurity
    初階 Spring Security添加maven依賴<dependency><groupId>org.springframework.boot</groupId>;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter