使用Spring @Autowired List的責任鏈

在Spring 3.1中,有一種方法可以自動填充類型化的List,這在您想在代碼中稍微進行去耦和清理時非常方便。

為了向您展示它是如何工作的,我將實現一個簡單的責任鏈,該責任鏈將為通過的用戶打印一些問候。

讓我們從我們擁有的(唯一的)域類(用戶)開始:

package com.marco.springchain;
public class User {private final String name;private final char gender;public User(String name, char gender) {super();this.name = name;this.gender = gender;}public String getName() {return name;}public char getGender() {return gender;}
}

然后,我們創建一個接口,該接口定義要在鏈中使用的命令對象的類型:

package com.marco.springchain;
public interface Printer {void print(User user);
}

這是Printer實現的通用類(模板)。

org.springframework.core.Ordered用于告訴AnnotationAwareOrderComparator我們希望如何對List進行排序。

如果不需要您的鏈來具有執行順序,則無需實現Ordered接口并重寫getOrder方法。

還要注意,這個抽象類返回Ordered.LOWEST_PRECEDENCE ,這是因為我希望一些打印機命令僅在鏈的末尾運行,并且我不在乎它們的執行順序(我保證,以后一切都會更清楚!)。

GenericPrinter

這是我們的第一個真正的打印機命令。 我希望它在鏈中具有絕對優先級,因此順序為HIGHEST_PRECEDENCE

package com.marco.springchain;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
@Component
public class HelloPrinter extends GenericPrinter {private static final String GREETING = 'Hello';@Overrideprotected String getGreeting() {return GREETING;}@Overridepublic int getOrder() {return Ordered.HIGHEST_PRECEDENCE;}
}

WelcomePrinter將作為第一個命令執行( 在高優先級命令之后 )。

package com.marco.springchain;
import org.springframework.stereotype.Component;
@Component
public class WelcomePrinter extends GenericPrinter {private static final String GREETING = 'Welcome to the autowired chain';@Overrideprotected String getGreeting() {return GREETING;}@Overridepublic int getOrder() {return 1;}
}

GoodbyePrinter將作為第二個命令執行

package com.marco.springchain;
import org.springframework.stereotype.Component;
@Component
public class GoodbyePrinter extends GenericPrinter {private static final String GREETING = 'Goodbye';@Overrideprotected String getGreeting() {return GREETING;}@Overridepublic int getOrder() {return 2;}
}

這兩個命令需要在其他命令之后執行,但是我不在乎它們的特定順序,因此我不會覆蓋getOrder方法,而讓GenericPrinter Ordered.LOWEST_PRECEDENCE為這兩個命令返回Ordered.LOWEST_PRECEDENCE

package com.marco.springchain;
import org.springframework.stereotype.Component;
@Component
public class CleaningMemoryPrinter extends GenericPrinter {private static final String GREETING = 'Cleaning memory after';@Overrideprotected String getGreeting() {return GREETING;}
}
package com.marco.springchain;
import org.springframework.stereotype.Component;
@Component
public class CleaningSpacePrinter extends GenericPrinter {private static final String GREETING = 'Cleaning space after';@Overrideprotected String getGreeting() {return GREETING;}
}

這是鏈上下文。

Spring將掃描(請參閱spring-config.xml)配置文件中指定的包,它將看到類型化的( List<Printer> )列表,并且它將使用實現該類型的任何@Component的實例填充該列表。打印機。

為了對List進行排序,我們使用AnnotationAwareOrderComparator.INSTANCE ,它使用getOrder方法對List進行重新排序( 值最低的對象具有最高優先級(有點類似于Servlet“啟動時加載”值 ) )。

package com.marco.springchain;
import java.util.Collections;
import java.util.List;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.stereotype.Component;
@Component
public class PrinterChain {@Autowiredprivate List<Printer> printers;@PostConstructpublic void init() {Collections.sort(printers, AnnotationAwareOrderComparator.INSTANCE);}public void introduceUser(User user) {for (Printer printer : printers) {printer.print(user);}}
}

src / main / resources中的spring-config.xml。

<?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:aop='http://www.springframework.org/schema/aop'xmlns:tx='http://www.springframework.org/schema/tx'xmlns:context='http://www.springframework.org/schema/context'xmlns:util='http://www.springframework.org/schema/util'xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd' default-lazy-init='true'><context:component-scan base-package='com.marco.springchain'/>
</beans>

最后,一個主類來測試我們的鏈。

package com.marco.springchain;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext('spring-config.xml');PrinterChain printerChain = (PrinterChain) context.getBean('printerChain');printerChain.introduceUser(new User('Marco Castigliego', 'M'));printerChain.introduceUser(new User('Julie Marot', 'F'));}
}

輸出:

Hello Mr Marco Castigliego
Welcome to the autowired chain Mr Marco Castigliego
Goodbye Mr Marco Castigliego
Cleaning space after Mr Marco Castigliego
Cleaning memory after Mr Marco Castigliego
Hello Mrs Julie Marot
Welcome to the autowired chain Mrs Julie Marot
Goodbye Mrs Julie Marot
Cleaning space after Mrs Julie Marot
Cleaning memory after Mrs Julie Marot

希望您喜歡這個例子。

參考: 使用來自我們的JCG合作伙伴 Marco Castigliego的Spring @Autowired List的責任鏈,位于“ 刪除重復和修復不良名稱”博客中。

翻譯自: https://www.javacodegeeks.com/2012/11/chain-of-responsibility-using-spring-autowired-list.html

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

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

相關文章

設計模式 建造者模式 與 Spring Bean建造者 BeanDefinitionBuilder 源碼與應用

建造者模式 定義: 將一個復雜對象的構建與它的表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示主要作用: 在用戶不知道對象的建造過程和細節的情況下就可以直接創建復雜的對象如何使用: 用戶只需要給出指定復雜對象的類型和內容, 建造者模式負責按順序創建復雜對象…

java 布隆過濾器_什么是布隆過濾器(Bloom Filter)?

在日常工作中&#xff0c;有一個比較常見的需求&#xff0c;就是需要判斷一個元素是否在集合中。例如以下場景&#xff1a;給定一個IP黑名單庫&#xff0c;檢查指定IP是否在黑名單中&#xff1f;在接收郵件的時候&#xff0c;判斷一個郵箱地址是否為垃圾郵件&#xff1f;在文字…

STM32上使用JSON

一、STM32工程中添加JSON 最近在一網2串項目&#xff0c;串口和網口之間可能需要定義一下簡單的通信協議&#xff0c;而通信協議上則需要去定義一下通信的數據格式&#xff0c;上次聽劍鋒說要用Json來定義&#xff0c;目前查了下資料具體如何去應用還不 會。因為最新的KEIL上支…

Flex 學習

Flex案例一&#xff1a; 1 <html>2 <head>3 <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> 4 <title>無標題</title>5 <style type"text/css">6 body,h1,h2,h3,h4,…

Cocos2d-X中實現自己定義菜單處理事件

當用戶點擊再松開后才會響應菜單事件&#xff0c;而在游戲中有些游戲須要玩家點擊后就處理事件。如玩坦克大戰的時候&#xff0c;玩家是點擊一下就發射子彈。并是點擊松手后發射子彈&#xff0c;在Cocos2d-X中沒有這樣的消息。以下就通過自己定義的方式實現當用戶點擊后就調用處…

java linkedhashset_java之LinkedHashSet

LinkedHashSet是Set集合的一個實現&#xff0c;具有set集合不重復的特點&#xff0c;同時具有可預測的迭代順序&#xff0c;也就是我們插入的順序。并且linkedHashSet是一個非線程安全的集合。如果有多個線程同時訪問當前linkedhashset集合容器&#xff0c;并且有一個線程對當前…

使用Spring Integration輪詢http端點

如果您想用Spring Integration編寫一個流程來輪詢HTTP端點并從http端點收集一些內容以進行進一步處理&#xff0c;那有點不直觀。 Spring Integration提供了幾種與HTTP端點集成的方式- Http出站適配器–將消息發送到http端點 Http出站網關–將消息發送到http端點并收集響應作…

python模塊離線安裝_離線安裝db2的python模塊ibm_db

1、為什么要離線安裝 沒網&#xff0c;在銀行工作&#xff0c;服務器環境配置&#xff0c;完全離線&#xff08;本來五分鐘搞定的事情&#xff0c;非要搞一天。我服&#xff01;&#xff01;&#xff09; 2、安裝步驟 視情況而定。 3。一個下載db2的client包&#xff0c;官網下…

Jmeter 場景設計

今天的業務場景是&#xff1a; 1.管理員登錄后臺---登錄成功后添加一個某類型的產品---產品添加成功后&#xff0c;再為該產品添加10個排期。 2.管理員登錄后臺--登錄成功后添加多個不同類型產品---產品全部添加完成后&#xff0c;依次為所有產品添加10個排期。 這是兩種不同的…

Android IPC機制(五)用Socket實現跨進程聊天程序

1.Socket簡介 Socket也稱作“套接字“&#xff0c;是在應用層和傳輸層之間的一個抽象層&#xff0c;它把TCP/IP層復雜的操作抽象為幾個簡單的接口供應用層調用以實現進程在網絡中通信。它分為流式套接字和數據包套接字&#xff0c;分別對應網絡傳輸控制層的TCP和UDP協議。TCP協…

ArcGIS 網絡分析[4] 網絡數據集深入淺出之連通性、網絡數據集的屬性及轉彎要素...

前面介紹完了如何創建網絡數據集、如何使用網絡分析功能&#xff0c;當然還有的讀者會迷惑于一些更深層次的問題&#xff0c;比如網絡數據集的連通性問題等。 因為不可能面面俱到&#xff0c;我只能挑重點來闡述&#xff0c;我覺得網絡數據集的連通性、屬性和轉彎是初學者中比較…

java獲取byte 長度_java獲取字節的長度.

我們經常要獲取中文,數字,或者英文字符所占字節的長度,下面就列出各種編碼格式下所占字節的長度:代碼如下:package pack.java.midea.dao;import java.io.UnsupportedEncodingException;/*** 測試;* author zhouhaitao* 2012-5-17*/public class Test {/*** param args* throws …

Batoo JPA –比領先的JPA提供商快15倍

介紹 我早在2000年代就喜歡JPA 1.0。 我甚至在穩定版本發布之前就將其與EJB 3.0一起使用。 我非常喜歡它&#xff0c;因此我為JBoss 3.x實現貢獻了一些零碎的部分。 那時我們公司規模還很小。 創建新功能和應用程序比性能更重要&#xff0c;因為我們有很多想法&#xff0c;我…

python軟件是哪個國家的品牌_有哪些好用的軟件被國人誤認為是外國研發的?

國產軟件被標榜上了英文&#xff0c;即便不是英文&#xff0c;用拼音寫出來&#xff0c;也會有人誤認為是國外的軟件。因為這樣可以顯得高大上&#xff0c;為什么我們會有這樣的想法&#xff0c;是崇洋媚外嗎&#xff0c;并不是&#xff0c;而是之前的國產軟件的確有不少讓我們…

簡單的Session案例 —— 一次性驗證碼

一次性驗證碼的主要目的就是為了限制人們利用工具軟件來暴力猜測密碼&#xff0c;其原理與利用Session防止表單重復提交的原理基本一樣&#xff0c;只是將表單標識號變成了驗證碼的形式&#xff0c;并且要求用戶將提示的驗證碼手工填寫進一個表單字段中&#xff0c;而不是通過表…

[BZOJ2064]分裂

[BZOJ2064]分裂 試題描述 背景&#xff1a; 和久必分&#xff0c;分久必和。。。 題目描述&#xff1a; 中國歷史上上分分和和次數非常多。。通讀中國歷史的WJMZBMR表示毫無壓力。 同時經常搞OI的他把這個變成了一個數學模型。 假設中國的國土總和是不變的。 每個國家都可以用他…

CSS3選擇器

基本選擇器 回顧選擇器 通配符選擇器元素選擇器類選擇器ID選擇器后代選擇器新增基本選擇器 子元素選擇器相鄰兄弟選擇器通用兄弟選擇器群組選擇器 子元素選擇器 概念&#xff1a;子元素選擇器只能選擇某元素的子元素 語法&#xff1a;父元素 > 子元素 &#xff08;Fathe…

eclipse java工程目錄_轉載:Eclipse下的java工程目錄

對新手來講&#xff0c;一個Java工程內部的多個文件夾經常會讓大家困惑。更可惡的是莫名其妙的路徑問題&#xff0c;在Eclipse編寫Java程序中&#xff0c;出現頻率最高的錯誤很可能就是路徑問題。這些問題原因其實都是一個&#xff0c;就是關于Java工程內的文件結構理解不清&am…

作為JBoss AS 7模塊運行Drools 5.4.0 Final

Drools 5引入了業務邏輯集成平臺&#xff0c;該平臺為規則&#xff0c;工作流和事件處理提供了統一的集成平臺。 它是從頭開始設計的&#xff0c;因此每個方面都是一流的公民&#xff0c;毫不妥協。 Drools 5已分為4個主要子項目&#xff1a; Drools Guvnor&#xff08;BRMS …

postgres 支持的線程數_線程池被打滿了怎么處理呢,你是否真的了解線程池?

0、前言線程池&#xff0c;顧名思義就是線程的池子&#xff0c;在每次需要取線程去執行任務的時候&#xff0c;沒必要每次都創建新線程執行&#xff0c;線程池就是起著維護線程的作用&#xff0c;當有任務的時候就取出一個線程執行&#xff0c;如果任務執行完成則把線程放回到池…