国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring基于Annotation的依賴注入小結

adam1q84 / 2683人閱讀

摘要:設想在未來我們為的構造函數新增字段那么上述代碼將修改為如果的初始化耗時很長,將影響構造函數的后續初始化工作。上述在構造函數里直接初始化的過程,屬于主動初始化依賴對象,二者耦合度高,不方便測試。調用方使用對進行依賴注入。

  最近接觸了幾個比較大的Java項目,其中常常存在Bean之間的依賴,例如在某服務啟動前要初始化各類詞典,主要方式有顯式聲明Bean和隱式注解注入2種,本文著重介紹后一種。

1. 依賴注入簡介

  首先我們定義“依賴”是什么:如果在Class A中有Class B的實例,則稱A依賴B。
現在我們來構造一個依賴:

public class UserDao {
    DBConnection conn;
    
    public UserDao() {
        // 先初始化數據庫連接
        conn = new DBConnection();
    }
}

上述代碼中,UserDao即對DBConnection存在依賴。但這樣構造依賴存在如下問題:
(1) 耦合度高。設想在未來我們為DBConnection的構造函數新增字段name,那么上述代碼將修改為:
conn = new DBConnection();
conn = new DBConnection(String name);
(2) 如果DBConnection的初始化耗時很長,將影響構造函數的后續初始化工作。

上述UserDao在構造函數里直接初始化DBConnection的過程,屬于主動初始化依賴對象,二者耦合度高,不方便測試。如果被依賴對象事先就初始化好了,直接供給本Class調用,則稱之為依賴注入。例如上述代碼可改寫為如下:

public class UserDao {
    @Autowired  //依賴注入
    DBConnection conn;
    public UserDao() {
    }
}

要使注入生效,我們還需要在DBConnection中添加Bean標識Component

@Component //將類標識為Bean
public class DBConnection {
    public DBConnection() {
        init(); //初始化工作
    }
}

同時,為了讓Bean的標識被探測到,我們還需要在xml配置文件中添加自動掃描:

到此處相信讀者大致了解其注入原理:

將一些初始化詞典、數據庫連接的類添加諸如@Component的標識,使之成為Bean。

Spring做自動掃描記錄下這些Bean。

調用方使用@Autowired對Bean進行依賴注入。
此處我將這3步分別命名為:服務Bean化、自動掃描、依賴注入。接下來我將詳細介紹這3部分。

2. 服務Bean化

  事實上我們可以在任何情況下使用@Component標識需要被"Bean化"的服務。但不久我們會發現,其他更有水平的代碼里會有更多富于變化的標識,例如:@Repository、@Service@Controller。這是怎么回事?設想我們現在有加載本地詞典的類A,本地詞典監控類B,二者有明顯區別:前者的功能視數據訪問,后者則是監控服務,我們更愿意對標識做更精細化的區分,具體如下:
  @Repository是為DAO(數據訪問)特制的聲明,將一個類聲明為Repository意味著該類主要功能是數據讀取、DB訪問。
  @Service則聲明該類為服務性質的Bean,例如上文中的詞典監控服務,還有許多無關數據操作的功能性初始化類,都應該被標識為Service
  @Controller聲明標志著一個類是SpringWeb的MVC控制器,主要負責MVC之間的操縱。另一個類似的聲明是@RequestMapping,將URL映射為一個方法。

以上3個新的聲明均為@Component的子集,因此僅僅使用@Component也不影響后續的掃描和注入過程。但在現實生活中,其實只有很少的場合我們需要用到@Component,例如無法給類做清晰的定位時。

3. 注解掃描

注意到上文中的這段自動掃描,它的包名其實可以根據用戶需求做出更改。例如:現在我有一個判斷query是否為臟詞的服務A,它依賴注入了自動加載臟詞詞典的類B。此外,項目中還存在訪問數據庫的類C,但我們沒有為數據庫配置訪問信息。當我們將注解掃描范圍設置為整個項目時,啟動服務A將產生問題。

解決方案是縮小自動掃描范圍,使得Spring僅掃描B而不掃描C。具體做法是增加掃描過濾器, Spring支持正則Regex和AspectJ兩種表達式的方式進行掃描過濾。
例如:


    
    

上面的xml配置就成功的掃描名為com.example.service.dictionary的package而忽略了以org.example.service.db為前綴的package。

4. 依賴注入

@Autowired:負責自動裝配被成功掃描的Bean。
@Qualifier("xxxxx"): 有時候我們有參數不同的兩個相同類的bean需要裝配(具體為什么會存在這種現象?可想象要連接2個數據庫。),那么如何多帶帶指定我需要裝配哪一個呢?@Qualifier配合@Autowired可用于消除這類歧義。

在方法內部,我們也有一些"注解":
@PostConstruct@PreDestroy是Bean內分別執行初始化和銷毀bean的注解。b>注意!它并不屬于Spring,而是屬于J2ee里的jar包,因此使用時需要在xml配置:

@PostConstruct: 初始化bean
@preDestroy: 結束前清理。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67467.html

相關文章

  • 慕課網_《使用Google Guice實現依賴注入》學習總結

    摘要:時間年月日星期六說明本文部分內容均來自慕課網。慕課網教學源碼學習源碼第一章課程介紹課程簡介是啥讀音是輕量級的依賴注入框架說明一個的框架需要有基礎什么是剝離注入輕量級代碼少易維護性能優異,跟比較。 時間:2017年10月14日星期六說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com 教學源碼:https://github.com/zccodere/s......

    2450184176 評論0 收藏0
  • 手寫Spring之DI依賴注入

    摘要:如感興趣,可移步手寫之基于動態創建對象手寫之基于注解動態創建對象今天將詳細介紹如何手寫依賴注入,在運行過程中如何動態地為對象的屬性賦值。完成后在中會有相關的包出現進行注入前需要創建工廠,在運行時從工廠中取出對象為屬性賦值。 前兩篇文章介紹了關于手寫Spring IOC控制反轉,由Spring工廠在運行過程中動態地創建對象的兩種方式。如感興趣,可移步: 手寫Spring之IOC基于xml...

    Cruise_Chan 評論0 收藏0
  • Spring核心 面向切面 AOP

    摘要:下圖展示了這些概念的關聯方式通知切面的工作被稱為通知。切面在指定的連接點被織入到目標對象中。該注解表明不僅僅是一個,還是一個切面。 在軟件開發中,散布于應用中多處的功能被稱為橫切關注點(crosscutting concern)。通常來講,這些橫切關注點從概念上是與應用的業務邏輯相分離的(但是往往會直接嵌入到應用的業務邏輯之中)。把這些橫切關注點與業務邏輯相分離正是面向切面編程(AOP...

    Winer 評論0 收藏0
  • 第一章--Spring之旅

    摘要:兩種方式來表示的應用上下文。日志,事務管理和安全這樣的系統服務經常融入到具有核心業務邏輯的組件中去,這些系統服務通過被稱為橫切關注點。容器使用管理構成應用的組件,他會創建相互協作的組件之間的關聯。的生命周期四俯瞰的風景線模塊,,,, 完整代碼請見:https://github.com/codercuixi...為了降低Java開發的復雜性,Spring采用了以下4種策略: 基于poj...

    pkwenda 評論0 收藏0
  • SpringBoot基礎篇AOP之基本使用姿勢小結

    摘要:通知和切點共同定義了關于切面的全部內容,它是什么時候,在何時和何處完成功能引入允許我們向現有的類添加新的方法或者屬性組裝方面來創建一個被通知對象。這可以在編譯時完成例如使用編譯器,也可以在運行時完成。和其他純框架一樣,在運行時完成織入。 原文:190301-SpringBoot基礎篇AOP之基本使用姿勢小結 一般來講,談到Spring的特性,繞不過去的就是DI(依賴注入)和AOP(切...

    timger 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<