1. 程式人生 > >spring Autowired註釋以及如何使用介面物件實現解耦

spring Autowired註釋以及如何使用介面物件實現解耦

@Autowired 註釋,它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作。 通過 @Autowired的使用來消除 set ,get方法。在使用@Autowired之前,我們對一個bean配置起屬性時,是這用用的

<property name="屬性名" value=" 屬性值"/>    

通過這種方式來,配置比較繁瑣,而且程式碼比較多。在Spring 2.5 引入了 @Autowired 註釋

下面用案例來具體說明

UserRepository.java

1 package com.proc.bean.repository;
2 
3 public
interface UserRepository { 4 5 void save(); 6 }

這裡定義了一個UserRepository介面,其中定義了一個save方法

UserRepositoryImps.java

複製程式碼
 1 package com.proc.bean.repository;
 2 
 3 import org.springframework.stereotype.Repository;
 4 
 5 @Repository("userRepository")
 6 public class UserRepositoryImps implements
UserRepository{ 7 8 @Override 9 public void save() { 10 System.out.println("UserRepositoryImps save"); 11 } 12 }
複製程式碼

定義一個UserRepository介面的實現類,並實現save方法,在這裡指定了該bean在IoC中識別符號名稱為userRepository

UserService.java

複製程式碼
 1 package com.proc.bean.service;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.stereotype.Service; 5 6 import com.proc.bean.repository.UserRepository; 7 8 @Service 9 public class UserService { 10 11 @Autowired 12 private UserRepository userRepository; 13 14 public void save(){ 15 userRepository.save(); 16 } 17 }
複製程式碼

這裡需要一個UserRepository型別的屬性,通過@Autowired自動裝配方式,從IoC容器中去查詢到,並返回給該屬性

applicationContext.xml配置

<context:component-scan base-package="com.proc.bean" />

測試程式碼:

1 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
2 
3 UserService userService=(UserService) ctx.getBean("userService");
4 userService.save();

輸出結果:UserRepositoryImps save

那麼使用@Autowired的原理是什麼?

  其實在啟動spring IoC時,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor後置處理器,當容器掃描到@Autowied、@Resource或@Inject時,就會在IoC容器自動查詢需要的bean,並裝配給該物件的屬性

 <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>  

 注意事項:

在使用@Autowired時,首先在容器中查詢對應型別的bean

    如果查詢結果剛好為一個,就將該bean裝配給@Autowired指定的資料

    如果查詢的結果不止一個,那麼@Autowired會根據名稱來查詢。

    如果查詢的結果為空,那麼會丟擲異常。解決方法時,使用required=false

舉例說明:

 在上面例子中,我們在定一個類來實現UserRepository介面

複製程式碼
package com.proc.bean.repository;

import org.springframework.stereotype.Repository;

@Repository
public class UserJdbcImps implements UserRepository {

    @Override
    public void save() {
        System.out.println("UserJdbcImps save");
    }
}
複製程式碼

  這時在啟動容器後,在容器中有兩個UserRepository型別的例項,一個名稱為userRepository,另一個為userJdbcImps。在UserService中

@Autowired
private UserRepository userRepository;

  輸出結果:UserRepositoryImps save

  這裡由於查詢到有兩個該型別的例項,那麼採用名稱匹配方式,在容器中查詢名稱為userRepository的例項,並自動裝配給該引數。

  如果這裡想要裝載userJdbcImps的例項,除了將欄位userRepository名稱改成userJdbcImps外,可以提供了一個@Qualifier標記,來指定需要裝配bean的名稱,程式碼這樣寫

1 @Autowired
2 @Qualifier("userJdbcImps")
3 private UserRepository userRepository;

輸出結果:UserJdbcImps save

相關推薦

spring Autowired註釋以及如何使用介面物件實現

@Autowired 註釋,它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作。 通過 @Autowired的使用來消除 set ,get方法。在使用@Autowired之前,我們對一個bean配置起屬性時,是這用用的 <property name="

spring中的Ioc技術是怎樣實現的 原文地址 : http://blog.csdn.net/liang5603/article/details/52002994

ioc容器 可能 深入 修改 知識 動態 出現 工廠方法 邏輯 1. IoC理論的背景我們都知道,在采用面向對象方法設計的軟件系統中,它的底層實現都是由N個對象組成的,所有的對象通過彼此的合作,最終實現系統的業務邏輯。圖1:軟件系統中耦合的對象如果我們打開機械式手表的後蓋,

人工智慧 人臉識別 使用MQ實現以及非同步

從之前的人臉識別的文章來看,使用到mq中間處理的主要在捉拍機獲取到的人臉識別的特徵傳送到rabbitMQ,然後單張人臉註冊的服務進行消費,這時候就是實現了服務之間的非同步處理以及解耦的作用 還有之前的批量處理上傳的人臉特徵的服務,使用的是同步的方式,這種方式確實有點low,需要非同步來處理提

業務程式碼:基於spring的銀行支付介面模型實現

1.業務邏輯     當用戶選擇某一特定商品後,點選支付按鈕;跳轉到對應的支付頁面,在使用者選擇對應的支付銀行方式後,在頁面實現對應的優惠資訊。同時點選支付後,根據銀行對應的報文要求,進行支付。 2.邏輯分析   3.技術點: 工廠模式,反

JAVA總結篇五(繼承、多型以及介面實現

繼承、多型以及介面的實現一、繼承繼承是一種聯結類的層次模式;在JAVA中一個類只能繼承一個類,這便是所謂的單一繼承;但一個類可以被多個類繼承,也就是說一個類可以有多個子類。通過使用extends使用;格式如下:public +class+類名+extends+父類名+{類體}

spring中的Ioc技術是怎樣實現

4. IOC為我們帶來了什麼好處 我們還是從USB的例子說起,使用USB外部裝置比使用內建硬碟,到底帶來什麼好處? 第一、USB裝置作為電腦主機的外部裝置,在插入主機之前,與電腦主機沒有任何的關係,只有被我們連線在一起之後,兩者才發生聯絡,具有相關性。所以,無論兩者中的任何一方出現什麼的問題,都不會影響另一

commons-logging日誌實現

truct illegal 工廠 man int 行為 efault context buffered 一、需要解耦 日誌是實際應用中的一個重要部分,日誌系統也有許多開源的實現,如java.util.logging, logback, log4j系列等。

後端DTO(資料傳輸物件)與DO(資料庫資料來源物件的好處

我們在後端的開發中經常會將DO物件傳到Service層直接作為DTO傳給前端,這樣做其實會有很多弊端。 (一)DO物件一般其成員域和資料庫欄位是對應的,所以不能新增額外的欄位,但是有時候端就是需要這個欄位。反之前端要向後端傳一些額外的欄位,DO也沒辦法接受,前端的Form表單不可能和資料庫共

EventBus實現,使用詳

1,建立一個springboot專案。結構如下: 2,引入jar包 <dependencies> <dependency> <groupId>org.springframework.boot</groupId>

android的activity介面跳轉

【一般的介面跳轉方式如下】 Intent intent = new Intent(); intent.setClass(HelloworldActivity.this, NextActivity.class);// 這裡強引用了NextActivit

JDBC使用Dao工廠模式讀取properties配置檔案實現

daoconfig.properties配置檔案內容: userDaoClass=com.ls.www.dao.impl.UserDaoImpl 測試類 package com.ls.www.da

【JavaScript】將方法從物件

在專案中我一直做的一件事情就是把方法從其物件中解耦。 map 、 filter 以及 reduce 並非是全部,但是它們肯定是首先獲得自由的。 解耦方法可以讓方法擺脫父物件所施加的限制,同時在表示程式碼的方式上給了我們更多的自由。 那麼這到底是啥玩意呢? 為簡便起見

Java 反射+工廠模式實現

在實際開發中,工廠模式是經常被用到的。 工廠模式的好處: 工廠模式可以達到類的解耦。 工廠類中工廠方法過多也是個問題,每新增一個類,則新增一個工廠方法,這會導致工廠方法過多。恰好,反射可以建立類的例項物件,而且可以採用統一操作Class.forNa

c#特性加反射實現

private Dictionary<string, IBean> beanObjcetDic = new Dictionary<string, IBean>(); /// <summary> /// 載入全部的業務物件

如何用最簡單的方式解釋依賴注入?依賴注入是如何實現的?

依賴注入(DI)和控制反轉(IOC)基本是一個意思,因為說起來誰都離不開誰。簡單來說,a依賴b,但a不控制b的建立和銷燬,僅使用b,那麼b的控制權交給a之外處理,這叫控制反轉(IOC),而a要依賴b,必然要使用b的instance,那麼通過a的介面,把b傳入;通過a的構造,把

java實現小案例

簡單地說,軟體工程中物件之間的耦合度就是物件之間的依賴性。指導使用和維護物件的主要問題是物件之間的多重依賴性。物件之間的耦合越高,維護成本越高。因此物件的設計應使類和構件之間的耦合最小。 檔案結構 Dao public interface IAccount

自定義bean物件實現序列化介面(Writable)以及實現案例

自定義bean物件序列化傳輸必須注意 (1) 實現Writable介面 (2)反序列化時,需要反射呼叫空建構函式,所以必須有空構造 public FlowBean() { super(); } (3)重寫序列化方法 @Override pu

Spring(二)------- AOP關鍵概念以及兩種實現方式

目錄 1. AOP 關鍵詞 2. AOP 的作用 3. AOP 的通知型別 4. 基於 xml 的配置方式 5. 基於註解的配置方式 6. 切面的優先順序 7. 重用切點表示式 8. 兩種方式的比較(摘自 spring 官方文件) 1. AOP 關鍵詞

Spring(二)------- AOP概念以及兩種實現方式

  target:目標類,需要被代理的類。例如:ArithmeticCalculator      Joinpoint(連線點):所謂連線點是指那些可能被攔截到的方法。例如:所有的方法      PointCut 切入點:已經被增強的連線點。例如:add()      advice:通知/增強,增強

【無私分享:ASP.NET CORE 專案實戰(第二章)】新增EF上下文物件,新增介面實現以及無處不在的依賴注入(DI)

目錄索引 簡介   上一章,我們介紹了安裝和新建控制器、檢視,這一章我們來建立個數據模型,並且新增介面和實現類。 新增EF上下文物件   按照我們以前的習慣,我們還是新建幾個資料夾   Commons:存放幫助類   Domians:資料模型   Services