Spring學習筆記—最小化Spring XML配置

? ? ? 自動裝配(autowiring)有助于減少甚至消除配置<property>元素和<constructor-arg>元素,讓Spring自動識別如何裝配Bean的依賴關系。

? ? ? 自動檢測(autodiscovery)比自動裝配更進了一步,讓Spring能夠自動識別哪些類需要被配置成Spring Bean,從而減少對<bean>元素的使用。

1.自動裝配屬性

? ???1.1 ?4種類型的自動裝配

? ? ??●?byName——把與Bean的屬性具有相同名字(或者ID)的其他Bean自動裝配到Bean的對應屬性中。如果沒有跟屬性的名字相匹配的Bean,則該屬性不進行裝配。
? ? ? ●?byType——把與Bean的屬性具有相同類型的其他Bean自動裝配到Bean的對應屬性中。如果沒有跟屬性的類型相匹配的Bean,則該屬性不被裝配。
? ? ? ●?constructor——把與Bean的構造器入參具有相同類型的其他Bean自動裝配到Bean構造器的對應入參中。
? ? ? ●?autodetect——首先嘗試使用constructor進行自動裝配。如果失敗,在嘗試使用byType進行自動裝配。
? ? ??
? ? ? byName自動裝配:
<bean id = "kenny" class = "com.ouc.test.springs.Instruments" autowire = "byName" ><property name = "song" value = "bells" />
</bean>
? ??為屬性自動裝配ID與該屬性的名字相同的Bean。
? ??
? ? ?byType自動裝配:
? ??如果Spring尋找到多個Bean,它們的類型與自動裝配的屬性類型都相匹配,Spring不會猜測哪一個Bean更適合自動裝配,而是會拋出異常。
? ? 可以為自動裝配標識一個首選Bean,或者可以取消某個Bean自動裝配的候選資格。為了使用primary屬性,不得不將非首選Bean的primary屬性設置為false。
<bean id = "saxophone" class = "com.ouc.test.springs.Saxophone" primary = "false" />
? ? primary屬性僅對標識首選Bean有意義。
? ? 如果希望排除某些Bean,可以設置這些Bean的autowire-candidate屬性為false。
<bean id = "saxophone" class = "com.ouc.test.springs.Saxophone" autowire-candidate = "false" />
? ? constructor自動裝配:
? ??如果要通過構造器注入來配置Bean,可以移除<constructor-arg>元素,由Spring在應用上下文中自動選擇Bean注入到構造器入參中。
<bean id = "saxophone" class="com.ouc.springs.test.Saxophone"  autowire ="constructor" />
? ? 最佳自動裝配:
<bean id = "saxophone" class="com.ouc.springs.test.Saxophone"  autowire ="autodetect" />

? ?1.2 默認自動裝配

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsddefault-autowire="byType" ></beans>

2 .使用注解裝配

? ??Spring容器默認禁用注解裝配。
? ? 啟用注解裝配最簡單的方式是使用Spring的context命名空間配置中的<context:annotation-config>元素。
? ? Spring 3 支持幾種不同的用于自動裝配的注解:
? ?? ●?Spring自帶的@Autowired注解;
? ? ?●?JSR-330的@Inject注解;
? ? ?●?JSR-250的@Resource注解。
? ??

? ?2.1?使用@Autowired

  @Autowiredpublic void setInstrument(Instrument instrument){this.instrument = instrument;}
? ???Spring會嘗試對該方法執行byType自動裝配,可以使用@Autowired標注需要自動裝配Bean引用的任意方法。
? ? ?可以使用@Autowired注解直接標注屬性,并刪除setter方法:
  @Autowiredprivate Instrument instrument;
? ? 1)可選的自動裝配:
? ? ? ? 默認情況下,@Autowired所標注的屬性或參數必須是可以裝配的。如果沒有Bean可以裝配到@Autowired所標注的屬性或參數中,自動裝配就會失敗(拋出NoSuchBeanDefinitionException).
? ? ? ? 可以通過設置@Autowired的required屬性為false來配置自動裝配是可選的。
    @Autowired(required=false)private Instrument instrument;
? ? ?2)限定歧義性的依賴
? ? @Qualifier注解縮小了自動裝配挑選候選Bean的范圍,通過指定Bean的ID把選擇范圍縮小到只剩下一個Bean。
    @Autowired@Qualifier("guitar")private Instrument instrument;
? ? ?3)創建自定義的限定器(Qualifier)
    import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import org.springframework.beans.factory.annotation.Qualifier;@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Qualifierpublic @interface StringedInstrument{}

? 2.2?借助@Inject實現基于標準的自動裝配

    @Injectprivate Instrument instrument;
? ? ?@Inject沒有required屬性。
? ? ?限定@Inject所標注的屬性。
    @Inject@Named("guitar")private Instrument instrument;
? ? @Named通過Bean的ID來標識可選擇的Bean,@Named實際上是一個使用@Qualifier注解所標注的注解。
? ? 創建自定義的JSR-330 Qualifier
    import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import javax.inject.Qualifier;@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Qualifierpublic @interface StringedInstrument{}

? ?2.3?在注解注入中使用表達式

      @Value("#{systemProperties.myFavoriteSong}")private String song;

3.自動檢測Bean

? ? ?使用<context:component-scan>元素配置自動檢測。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="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-3.1.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/beans/spring-context-3.1.xsd" ><context:component-scan base-package="com.ouc.springs.test" ></context:component-scan></beans>

? ? 3.1為自動檢測標注Bean

? ? ?默認情況下,<context:component-scan>查找使用構造型(stereotype)注解所標注的類,這些特殊的注解如下:
? ? ? ?@Component——通用的構造型注解,標識該類為Spring組件。
? ? ? ?@Controller——標識將該類定義為Spring MVC Controller。
? ? ? ?@Repository——標識將該類定義為數據倉庫。
? ? ? ?@Service——標識將該類定義為服務。
? ? ? ? 使用@Component標注的任意自定義注解。

? ?3.2?過濾組件掃描

? ? 通過為<context:component-scan>配置<context:include-filter>和<context:exclude-filter>子元素,可以隨意調整掃描行為。
<context:component-scan base-package="com.ouc.springs.test" ><context:include-filter type="assignable" expression="com.ouc.springs.tst.Instrument" /><context:exclude-filter type="annotation" expression="com.ouc.springs.tst.SkipIt" />
</context:component-scan>
? ??

4.使用Spring基于Java的配置

? ? 4.1?定義一個配置類

   import org.springframework.context.annotation.Configuration;@Configurationpublic class SpringIdolConfig{}
? ? @Configuration注解會作為一個標識告知Spring:這個類將包含一個或多個Spring Bean的定義。
? ??

? ?4.2 聲明一個簡單的Bean

   @Beanpublic Performer duke(){return new Juggler();}
? ? ? @Bean告知Spring這個方法將返回一個對象,該對象應該被注冊為Spring應用上下文中的一個Bean,方法名將作為該Bean的ID。

轉載于:https://www.cnblogs.com/wp5719/p/5136177.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256093.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256093.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256093.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據結構】——快速排序

目錄 一、代碼 二、復雜度&#xff1a;O(nlog(n)) 三、快速排序的劣勢 視頻參考鏈接&#xff1a;https://www.bilibili.com/video/BV1mp4y1D7UP?p17 一、代碼 思想&#xff1a;假設是對一個list進行排序 1、選取第一個元素作為p元素&#xff1b; 2、將p元素歸位&#xff0…

讀取數據庫信息構建視圖字段的備注信息,方便程序代碼生成

在很多情況下&#xff0c;我們開發都需要有一個快速的代碼生成工具用來提高開發效率&#xff0c;代碼生成工具很多信息都是讀取數據庫的表、視圖等元數據進行對象表信息的完善&#xff0c;有了這些信息&#xff0c;我們就可以在普通的實體類代碼里面添加屬性字段的中文注釋&…

Ubuntu DNS bind9 配置

下面的配置就是實現解析test.zp.com到不同的IP地址 安裝dns server軟件包$ apt-get install bind9 配置dns配置文件的路徑在/etc/bind路徑下面添加一個zone$ /etc/bind# vim /etc/bind/named.conf.local 添加下面&#xff0c;語法可以參照/etc/bind/zones.rfc1918中的語法添加&…

微博分享錯誤

昨天再做這塊的時候&#xff0c;不知怎么的點擊之后什么反應都沒有&#xff0c;程序也沒有崩&#xff0c;日志倒是輸出了這個錯誤 解決辦法&#xff1a;打開你寫分享的代碼跟API文檔對比一下創建文本、圖片或者網頁的時候是不是少寫了那個屬性&#xff0c;我這里是在創建網頁的…

C++總結筆記(十二)—— 智能指針

文章目錄前言一、智能指針是什么&#xff1f;二、示例總結前言 C對于內存管理的要求很高&#xff0c;如果不及時釋放對象內存&#xff0c;就可能會發生內存泄露或野指針等情況&#xff0c;鑒于這種情況&#xff0c;C11提出了智能指針的概念。 一、智能指針是什么&#xff1f;…

代碼生成工具之界面快速生成

界面開發&#xff0c;無論對于Web開發&#xff0c;還是Winform開發&#xff0c;都需要耗費一定的時間&#xff0c;特別對于一個數據庫字段比較多的界面&#xff0c;一般就需要在編輯界面上擺的更多的控件來做數據顯示&#xff0c;每次碰到這個&#xff0c;都有點頭痛&#xff0…

javascript - 封裝原生js實現ajax

1 /*2 * ajax方法3 */4 var Ajax function() {5 var that this;6 //創建異步請求對象方法7 that.createXHR function() {8 if(window.XMLHttpRequ…

QT對象樹、信號和槽機制

文章目錄一 、對象樹是什么&#xff1f;二、信號和槽的基本概念2.1 信號2.2 槽2.3 松散耦合2.4 特點三、示例總結一 、對象樹是什么&#xff1f; 對象樹是由父類和若干子類對象組成&#xff0c;而子類也可以由若干孫類。 QT中的對象樹是以QObject為起始父類來完成樹的構建的&a…

【數據結構】——歸并排序

目錄 一、代碼 二、隨筆 一、代碼 歸并排序的主要思路&#xff1a;將兩個有序的子列表歸并為一個有序的大列表 #歸并函數&#xff0c;假設li是由左右兩個有序的子列表組成,假設兩個子列表都是從小到大排好序的列表 def merge(li,low,mid,high)::param li: 由左右兩個有序的子列…

開發發布npm module包

開發發布npm module包 問題 在項目開發過程中&#xff0c;每當進入一個新的業務項目&#xff0c;從零開始搭建一套前端項目結構是一件讓人頭疼的事情&#xff0c;就要重新復制一個上一個項目的前端框架和組件代碼庫。其中很多功能的模塊組件都要重復拷貝&#xff0c;可以統一將…

如何使用ATS提高應用的安全性

App Transport Security&#xff0c;簡短的說就是ATS&#xff0c;是iOS9和OS X El Capitan的一個新特性。App Transport Security 的目標是提高Apple 操作系統的安全性以及在此操作系統上運行的任何應用的安全性。 基于HTTP傳輸數據的網絡請求都是明文。開啟App Transport Secu…

手機客戶端測試考慮的點

手機客戶端測試考慮點總結 版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 此文未本人工作中的總結&#xff0c;特此總結。 異常場景&#xff1a; 網絡異常&#xff0c;服務器異常&#xff0c;接口異常或參考參數篡改&#xff0c;斷電&#xff0c;…

NMS(非極大值抑制)算法詳解與示例

一、NMS是什么&#xff1f; NMS&#xff08;non maximum suppression&#xff09;即非極大值抑制&#xff0c;廣泛應用于傳統的特征提取和深度學習的目標檢測算法中。 NMS原理是通過篩選出局部極大值得到最優解。 在2維邊緣提取中體現在提取邊緣輪廓后將一些梯度方向變化率較小…

【數據結構】——冒泡排序、插入排序、選擇排序

# 冒泡排序&#xff0c;復雜度為O(n^2) def bubble_sorted(li:list)->list:for i in range(len(li)):# 第幾趟exchanged False# 這個是為了防止多余的遍歷&#xff0c;如果前面的元素已經是排序好的&#xff0c;那就不需要再進行比較了&#xff0c;減少運行時間for j in ra…

【轉載】ASP.NET應用程序與頁面生命周期

在本文中&#xff0c;我們將了解不同的事件&#xff0c;ASP.NET 應用程序的生命周期以瀏覽器向 Web 服務器&#xff08;對于 ASP.NET 應用程序&#xff0c;通常為 IIS&#xff09;發送請求為起點&#xff0c;直至將請求結果返回至瀏覽器結束。在這個過程中&#xff0c;首先我們…

基于PCL的ICP及其變種算法實現

文章目錄前言一、ICP算法基礎1.1 提取待匹配點對1.2 計算旋轉平移矩陣1.3 計算變換后的點和目標點之間的偏差二、ICP算法變種2.1 PLICP2.2 PointToPlane ICP2.3 NICP2.4 LM_ICP三、程序示例1. 傳統方法2. PointToPlane ICP總結前言 ICP&#xff08;Iterative Closest Point&am…

python 計算器

--coding:utf-8-- from Tkinter import * 創建橫條型框架 def frame(root, side): w Frame(root) w.pack(side side, expand YES, fill BOTH) return w 創建按鈕 def button(root, side, text, command None): w Button(root, text text, command command) w.pack(side…

最長公共子序列(LCS)

注意最長公共子串&#xff08;Longest CommonSubstring&#xff09;和最長公共子序列&#xff08;LongestCommon Subsequence, LCS&#xff09;的區別&#xff1a;子串&#xff08;Substring&#xff09;是串的一個連續的部分&#xff0c;子序列&#xff08;Subsequence&#x…

【數據結構】——排序算法系列總結

目錄 1、空間復雜度 2、穩定性 3、運行時間 4、目前默認的sort內置函數排序函數 5、六種常用排序方法 1、空間復雜度 空間復雜度產生的原因有兩個&#xff1a;①重新定義了一塊空間用于存儲數據&#xff1b;②遞歸產生了棧空間 冒泡排序、選擇排序、堆排序和插入排序屬于…

Spring Boot實踐教程(二):SpringApplication分析

2019獨角獸企業重金招聘Python工程師標準>>> 本文會通過分析上一篇中跑起來的示例程序來分析一下Spring Boot程序運行的基本原理。 概要 在上一篇的介紹中&#xff0c;程序是通過SpringBoot1HelloworldApplication.main()方法運行起來的&#xff1a; public static …