1. 程式人生 > >Spring:依賴注入(註解方式)、泛型依賴注入

Spring:依賴注入(註解方式)、泛型依賴注入

註解方式實現依賴注入支援手工裝配和自動裝配(慎用)

一般是宣告bean和bean直接的依賴關係的時候用比較好

使用註解方式時,也支援給Field注入值(在XML中不可以給Field注入)。另外就是setter方式注入。

@Resource註解在spring安裝目錄的lib\j2ee\common-annotations.jar

註解方式必須

1、 引入context名稱空間。

2、 在配置檔案中新增context:component-scan標籤。多個包的時候,可以用逗號隔開。(表示把這些物件納入容器管理)

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:context="http://www.springframework.org/schema/context"

    xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd"

>

<!--設定為自動掃描與裝配bean,掃描指定包及其所有下級包中的類,可以寫多個,之間用英文的逗號隔開 -->

<context:component-scanbase-package="cn.itcast"></context:component-scan>

</beans>

spring2.5為我們引入了元件自動掃描機制,它可以在類路徑底下尋找標註了@Component@Service@Controller@Repository註解的類並把這些類納入進spring容器中管理。它的作用和在xml檔案中使用bean節點配置元件是一樣的。

功能介紹:

@Service用於標註業務層元件、

@Controller用於標註控制層元件(如struts中的action)、

@Repository用於標註資料訪問元件,即DAO元件。

@Component泛指元件,當元件不好歸類的時候,我們可以使用這個註解進行標註。

@Scope用於指定當前bean的作用域,是使用prototype還是singleton。

這需要通過@Resource註解實現,@Resource註解可以標註在欄位或屬性的setter方法上,但它預設按名稱裝配。名稱可以通過@Resourcename屬性指定,如果沒有指定name屬性,當註解標註在欄位上,即預設取欄位的名稱作為bean名稱尋找依賴物件,當註解標註在屬性的setter方法上,即預設取屬性名作為bean名稱尋找依賴物件。

@Resource預設按名稱裝配,當找不到與名稱匹配的bean才會按型別裝配。如果沒有指定name屬性,並且按照預設的名稱找不到依賴物件時, @Resource註解會回退到按型別裝配。但一旦指定了name屬性,就只能按名稱裝配了。

例如:

@Resource(name="personDao")

private PersonDao personDao;;//用於欄位上

@Resource(name="personDao")

public void setPersonDao(PersonDao personDao) {//用於屬性的set方法上

      this.personDao = personDao;

}

後一種相當於xml配置檔案中的

<property name=“personDao"ref="personDao" />

自動裝配

<beanid=“foo” class=“...Foo” autowire=“autowiretype”>

 autowire屬性取值如下

*  byType:按型別裝配,可以根據屬性的型別,在容器中尋找跟該型別匹配的bean。如果發現多個,那麼將會丟擲異常。如果沒有找到,即屬性值為null。

 * byName:按名稱裝配,可以根據屬性的名稱,在容器中尋找跟該屬性名相同的bean,如果沒有找到,即屬性值為null。

*constructor與byType的方式類似,不同之處在於它應用於構造器引數。如果在容器中沒有找到與構造器引數型別一致的bean,那麼將會丟擲異常。

*autodetect :首先嚐試使用constructor來自動裝配,然後使用byType方式。不確定性的處理與constructor方式和byType方式一致。(通過bean類的自省機制(introspection)來決定是使用constructor還是byType方式進行自動裝配。如果發現預設的構造器,那麼將使用byType方式。)

在實際應用中建議使用手工裝配,因為自動裝配會產生未知情況,開發人員無法預見最終的裝配結果。

也可以使用autowire註解自動實現注入,它按照型別匹配,也可以結合required註解實現按照名字匹配,這個是spring提供的註解,而resource註解是javaee提供的註解

用誰一目瞭然。

元件掃描(component scanning):  Spring 能夠從 classpath 下自動掃描, 偵測和例項化具有特定註解的元件. 
特定元件包括:
@Component: 基本註解, 標識了一個受 Spring 管理的元件
@Respository: 標識持久層元件
@Service: 標識服務層(業務層)元件
@Controller: 標識表現層元件
對於掃描到的元件, Spring 有預設的命名策略: 使用非限定類名, 第一個字母小寫. 也可以在註解中通過 value 屬性值標識元件的名稱。

當在元件類上使用了特定的註解之後, 還需要在 Spring 的配置檔案中宣告 <context:component-scan> :
base-package 屬性指定一個需要掃描的基類包,Spring 容器將會掃描這個基類包裡及其子包中的所有類. 
當需要掃描多個包時, 可以使用逗號分隔.
如果僅希望掃描特定的類而非基包下的所有類,可使用 resource-pattern 屬性過濾特定的類,示例:


<context:include-filter> 子節點表示要包含的目標類
<context:exclude-filter> 子節點表示要排除在外的目標類
<context:component-scan> 下可以擁有若干個 <context:include-filter> 和 <context:exclude-filter> 子節點

<context:include-filter> 和 <context:exclude-filter> 子節點支援多種型別的過濾表示式:


<context:component-scan> 元素還會自動註冊 AutowiredAnnotationBeanPostProcessor 例項, 該例項可以自動裝配具有 @Autowired 和 @Resource 、@Inject註解的屬性.

@Autowired 註解自動裝配具有相容型別的單個 Bean屬性
構造器, 普通欄位(即使是非 public), 一切具有引數的方法都可以應用@Authwired 註解
預設情況下, 所有使用 @Authwired 註解的屬性都需要被設定. 當 Spring 找不到匹配的 Bean 裝配屬性時, 會丟擲異常, 若某一屬性允許不被設定, 可以設定 @Authwired 註解的 required 屬性為 false
預設情況下, 當 IOC 容器裡存在多個型別相容的 Bean 時, 通過型別的自動裝配將無法工作. 此時可以在 @Qualifier 註解裡提供 Bean 的名稱. Spring 允許對方法的入參標註 @Qualifiter 已指定注入 Bean 的名稱
@Authwired 註解也可以應用在陣列型別的屬性上, 此時 Spring 將會把所有匹配的 Bean 進行自動裝配.
@Authwired 註解也可以應用在集合屬性上, 此時 Spring 讀取該集合的型別資訊, 然後自動裝配所有與之相容的 Bean. 
@Authwired 註解用在 java.util.Map 上時, 若該 Map 的鍵值為 String, 那麼 Spring 將自動裝配與之 Map 值型別相容的 Bean, 此時 Bean 的名稱作為鍵值
Spring 還支援 @Resource 和 @Inject 註解,這兩個註解和 @Autowired 註解的功用類似
@Resource 註解要求提供一個 Bean 名稱的屬性,若該屬性為空,則自動採用標註處的變數或方法名作為 Bean 的名稱
@Inject 和 @Autowired 註解一樣也是按型別匹配注入的 Bean, 但沒有 reqired 屬性
建議使用 @Autowired 註解


BaseService使用Autowired建立與BaseRepository之間的關係。


它的子類就會根據泛型T注入對應的類。



此service自動注入的就是userRepository


相關推薦

Spring依賴注入註解方式依賴注入

註解方式實現依賴注入支援手工裝配和自動裝配(慎用) 一般是宣告bean和bean直接的依賴關係的時候用比較好 使用註解方式時,也支援給Field注入值(在XML中不可以給Field注入)。另外就是setter方式注入。 @Resource註解在spring安裝目錄的lib\

spring的bean管理註解方式

elasticsearch1.Spring的Bean管理的中常用的註解@Component:組件.(作用在類上)public interface UserDao { public void sayHello(); } @Component(value="userDao")

Spring --13.Spring中AOP程式設計註解方式

1、基於註解AOP入門案例 1.2、建立工程引入依賴 pom.xml <dependencies> <dependency> <groupId>org.springframework</groupId&

Spring Boot快速入門使用MyBatis註解形式進行數據庫操作

訪問 ins name ont clas assert xxx main apach 原文地址:https://lierabbit.cn/articles/7 添加依賴 新建項目選擇web,MyBatis,MySQL三個依賴 對於已存在的項目可以在bulid.gradle

Spring的Bean管理XML方式&屬性注入

1、Spring對Bean的例項化方式 Bean已經都交給Spring進行管理,Spring在建立這些類的時候,有三種方式 1.1 無參構造方法的方式(預設) 編寫類 public class Bean1{ public void Bean1(){ super();

Spring框架的AOP技術註解方式

1. 步驟一:建立JavaWEB專案,引入具體的開發的jar包 * 先引入Spring框架開發的基本開發包 * 再引入Spring框架的AOP的開發包 * spring的傳統AOP的開發的包 * spring-aop-4.2.4.RELEASE.jar

10 Spring框架的AOP技術註解方式

引入Spring框架開發的基本開發包,spring的傳統AOP的開發的包與aspectJ的開發包 建立spring配置檔案 applicationContext.xml <beans xmlns="http://www.springfra

spring事務的傳播屬性和事務隔離級別及配置事務註解方式

一、Propagation (事務的傳播屬性) Propagation :  key屬性確定代理應該給哪個方法增加事務行為。這樣的屬性最重要的部份是傳播行為。有以下選項可供使用:   PROPAGATION_REQUIRED--支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。 PROPAG

Spring Boot快速入門使用MyBatis註解形式進行資料庫操作

新增依賴 新建專案選擇web,MyBatis,MySQL三個依賴 對於已存在的專案可以在bulid.gradle加入,spring boot將會幫你自動配置好 compile('org.springframework.boot:spring-boot-sta

Spring學習5-Spring整合JDBC及其事務處理註解方式

  2、步驟二:使用JdbcTemplate類操作資料庫:     Spring把JDBC中重複的操作建立成了一個模板類:org.springframework.jdbc.core.JdbcTemplate。   A:要使用JdbcTemplate,需要為每一個DAO配置一個JdbcTemplate例項:  

Spring類載入註解方式

通過 Spring 註冊的類一共只有三種載入方式!環境: spring-context 4.2.6 jdk 7 Eclipse Neon for j2ee最簡單的配置<?xml version="

spring boot + hibernate 多資料來源註解方式

一)spring boot  + hibernate 多資料來源(XML) import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.En

Spring學習筆記】11 spring aop 程式設計註解方式

2018.5.25註解方式比較繁瑣不直觀,瞭解即可1.建立web專案2.引入jar包在原來jar包基礎上引入aop相關的jar包3.日誌檔案log4j.properties4.準備目標物件先建立介面再建立實現類package com.lu.spring.aop.service

徹底搞懂Spring類載入註解方式

目錄 通過 Spring 註冊的類一共只有三種載入方式! 環境: spring-context 4.2.6 jdk 7 Eclipse Neon for j2ee 最簡單的配置 <?xml version="1.0" e

spring aop的使用註解方式以及基於xml配置方式

註解方式 ******************* beans.xml ******************* <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springf

【初識Spring】物件Bean例項化及屬性注入xml方式

初識Spring之Bean例項化及屬性注入 1.通過xml配置的方式進行例項化。 - 配置檔案中bean標籤的常用屬性 - 通過無參構造(常用) - 使用靜態工廠進行建立 - 使用例項工廠進行建立 2.屬性注入。 - 使用有引數構造方法注入屬性

Spring --12.Spring中AOP程式設計XML方式

1、AOP入門案例 1.1、建立工程並引入依賴 工程為com.day03 依賴如下: <!--依賴--> <dependencies> <dependency> <groupId>or

SpringMVC框架11.2 入門程式—處理器對映器和處理器介面卡註解方式

1.DispatcherServlet載入時會預設載入 DispatcherServlet.properties 檔案,目的是為了載入裡面的處理器對映器、處理器介面卡、檢視解析器等各個元件;(所以 springmvc.xml 中 兩種處理器介面卡、兩種處理器介面卡、檢視解析器都可以省略;)

Spring的bean管理xml方式之Bean例項化的方式

1 在spring裡面通過配置檔案建立物件 2 bean例項化三種方式實現 第一種、使用類的無引數構造建立(重點) (1) xml 檔案 bean1.xml <?xml version="1.0" encoding="UTF-8"?><beans xm

什麼是建構函式注入Constructor Injection——一個具體的依賴注入例子

Disclaimer: Almost all of this was "stolen" from the Ninject Wiki 什麼是建構函式注入呢,建構函式注入是不是就是一個具體的依賴注入呢,下面給個例子來解釋: 構造器注入就是一個具體的依賴注入的例子: Le