1. 程式人生 > >spring List Map注入&抽象類注入

spring List Map注入&抽象類注入

翻看之前專案程式碼,發現一段這樣的注入,將抽象類PaymentPlugin所有的子類注入到集合中

    @Inject
    private List<PaymentPlugin> paymentPlugins = new ArrayList<>();
    @Inject
    private Map<String, PaymentPlugin> paymentPluginMap = new HashMap<>();

全域性搜尋之後並沒有發現關於這兩處的配置,這究竟是如何實現的?

後來在搜尋引擎和實踐的幫助下發現,spring可以將一個介面

或者抽象類的所有實現類注入到List和Map中,只要在子類上加入註解宣告交由spring容器託管。

//抽象父類
public abstract class PaymentPlugin {
}
//子類
@Component("weixinPublicPaymentPlugin")
public class WeixinPublicPaymentPlugin extends PaymentPlugin {
}
@Component("t")
public class T extends PaymentPlugin {
}
//介面
public interface PluginService {
}
//實現類
@Service public class PluginServiceImpl implements PluginService { }

測試程式碼如下

@Controller("testController")
public class Test {
    
    @Resource(name="weixinPublicPaymentPlugin")
    private PaymentPlugin paymentPlugin;
    @Inject
    private List<PaymentPlugin> paymentPlugins = new ArrayList<>();
    @Inject
private Map<String, PaymentPlugin> paymentPluginMap = new HashMap<>(); @Inject private List<PluginService> pluginServices = new ArrayList<>(); @Inject private Map<String, PluginService> pluginServiceMap = new HashMap<>(); @RequestMapping("/test") @ResponseBody public void test() { System.out.println("注入單例項:"+paymentPlugin); System.out.println("抽象集合list:"+paymentPlugins); System.out.println("抽象集合map:"+paymentPluginMap); System.out.println("介面集合list:"+pluginServices); System.out.println("介面集合map:"+pluginServiceMap); } }

列印結果如下

注入單例項:com[email protected]e7fdf9a3
抽象集合list:[[email protected], com[email protected]e7fdf9a3]
抽象集合map:{[email protected], weixinPublicPaymentPlugin=com[email protected]e7fdf9a3}
介面集合list:[[email protected]]
介面集合map:{[email protected]055ec87}

我在上網查詢相關資料的時候發現,有的部落格說spring無法注入抽象類,實測上述配置下,spring可以對抽象類進行注入,多個實現類,用name指定需要注入的bean即可。

相關推薦

spring List Map注入&抽象注入

翻看之前專案程式碼,發現一段這樣的注入,將抽象類PaymentPlugin所有的子類注入到集合中 @Inject private List<PaymentPlugin> paymentPlugins = new ArrayList<>(); @Inject

關於使用spring框架的時候抽象注入其他實現失敗的解決方法

/** * 抽象基類,為所有子類提供一個 流程操作演算法框架。 * @author */ @Transactional public abstract class RefreshBeverage { @Resource private TaskFollowMapper taskFo

spring list map set

cto tlist some mem try call java -a OS 1 list <!-- result in a setSomeList(java.util.List) call --> <property name="someList">

Set,List, Map各自實現的比較

介面 實現類 實現方式 特點 Set HashSet 連結串列的陣列(雜湊表) 1、HashSet類按照雜湊演算法來存取集合中的物件,存取速度比較快。 2、存入Hash

Spring中的Assert抽象

/* * Copyright 2002-2007 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); you may n

Spring 如何使用註解注入集合list、set、map

首先通過示例來展示,如何在Spring中使用註解注入集合類(list、map、set等) 定義介面InjectService,繼承InitializingBean介面,便於列印Spring注入的例項物件 public interface InjectService extends Initi

spring抽象注入bean

在使用spring的時候,有時由於設計的需要,需要使用抽象類(比如模板方法模式),但在抽象類中實現方法是需要依賴其他的介面或類的方法,這時就需要對依賴的介面或類進行注入,需要注意以下內容: 在抽象類中需要注入(@autowire),在繼承了該抽象類的子類中同樣需要再次注入。比如當前專案中,使用者

spring 框架 list、set、map、Properties陣列注入

package com.zxk.test;import java.util.List;import java.util.Map;import java.util.Properties;import java.util.Set;import org.springframework.context.Applica

spring抽象中屬性的自動注入

在使用spring的時候,有時由於設計的需要,需要使用抽象類(比如模板方法模式),但在抽象類中實現方法是需要依賴其他的介面或類的方法,這時就需要對依賴的介面或類進行注入,需要注意以下內容: 在抽象類中需要注入(@autowire),在繼承了該抽象類的子類中同樣需要再次注入。

python 抽象抽象方法、介面、依賴注入、SOLIP

python 抽象類、抽象方法、介面、依賴注入、SOLIP    1、程式設計原則:SOLIP SOLIP設計原則   1、單一責任原則(SRP)     一個物件對只應該為一個元素負責   2、開放封閉原則(OCP)     對擴充套件開放,修改封閉   3、里

spring靜態注入

建立XmppMessageUtil類 static Logger logger = LoggerFactory.getLogger(XmppMessageUtil.class); private static XmppMessageUtil xmppMessageUti

Spring 注入實現報錯問題

在使用spring 時,假如在controller中注入了impl 實現類可能會出現報錯的情況。 為什麼是“可能”,① 假如沒用使用spring aop ,則不會報錯。                 &nb

工具中使用Spring注入

工具類中使用Spring注入的類並使用該類中的方法 @Component public class ExcelUtil {     @Autowired   private UserService userService;   private static

spring的過濾器中注入實體(@autowire會失效可使用這個方法)

轉載:難得可貴的好文章 https://blog.csdn.net/chl191623691/article/details/78657638   首先,本文   絕對是好文!不止本文,作者的文章都是很經典的,希望大家給小編一個贊,關注一下! 今天在做使用者使用cookie自動登入

Spring boot中使用工具 無需注入獲取.yml中的值

專案中經常需要將路徑URL等資訊單獨提出寫到配置檔案中,之前使用Spring時一般都是用 .properties檔案來存這些公共資訊,那麼如何在spring boot中優雅的使用.yml檔案存取呢、、首先定義存放公共資訊的 .yml 配置檔案定義為 application-c

Spring注入的屬性 在子中呼叫為null

在spring中注入屬性的目標是例項而不是類 子類從父類繼承的值是與例項無關的 所以子類的屬性並沒有被賦值 工作背景: 有一個BaseService 有3個Dao成員 DaoA DaoB DaoC 並且 spring 為這3個成員分別注入了值 這三個Dao是直接可以拿過來執

使用spring註解,注入sessionFactory

簡述 目前使用spring hibernate作為專案的框架,並且使用註解方式進行物件裝載。在裝載Dao物件的時候常常需要注入sessionFactory物件,通常的做法是Dao繼承至HibernateDaoSuppor,t然後在Dao中新增setSuperSessionF

給sturts Action注入spring bean的幾種已測試、可行的方法

只在struts中註冊一次(class屬性是全限定名),令action中屬性名與bean id/name一致,自動完成注入。無需設定set和get方法。 需注意,如果bean id/name 是首字母大寫,第二個字母小寫或者只有首字母時,外掛不會注入bean。因為外掛尋找的set方法是符合sun命名規範

關於在spring依賴注入中使用測試解決辦法

剛接觸專案的實習生,積累經驗,歡迎交流 今天在專案中,遇到了一個問題:在一個spring管理的類中,使用junit測試類,總會報一個非法引數異常, 之後查詢了資料後終於找到了解決辦法,博主寫的十分詳細,資料:部落格連結 我就拾人牙慧,直接上解決辦法了: 先寫一個BaseSp

Spring為屬性注入某個的常量或方法的返回值

spring提供了filed的值注入和method的返回值注入。 1、Field值的注入 filed值注入需要使用org.springframework.beans.factory.config.FieldRetrievingFactoryBean來獲取類的靜態變數。 例如