最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用spring動態(tài)獲取接口的不同實現(xiàn)類

 更新時間:2022年02月25日 11:32:29   作者:CarinaYang  
這篇文章主要介紹了使用spring動態(tài)獲取接口的不同實現(xiàn)類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

spring動態(tài)獲取接口的不同實現(xiàn)類

最近做項目,有個需求是和外部對接,從接口獲取新聞數(shù)據(jù),把數(shù)據(jù)和緩存中的數(shù)據(jù)對比,多了的添加到數(shù)據(jù)庫,少了的刪掉。

接口有兩個,一開始我是在業(yè)務(wù)類里寫了兩個方法,代碼太長,簡單說就是兩個部分:

public Object saveANews() {
	//1、獲取A接口新聞列表
    //2、和緩存對比,存數(shù)據(jù)到數(shù)據(jù)庫
}
 
public Object saveBNews() {
	//1、獲取B新聞列表
    //2、和緩存對比,存數(shù)據(jù)到數(shù)據(jù)庫
}

寫完后我發(fā)現(xiàn),因為操作的是數(shù)據(jù)庫的同一張表,2的部分代碼完全一模一樣,只有1的部分不同,而1的部分其實就只有一行代碼。。。

這必須得復(fù)用啊,而且是一個業(yè)務(wù),也沒必要分別用兩個方法,于是我改成了這樣:

//業(yè)務(wù)接口實現(xiàn)方法
public Object saveNews(NewsUtilService service) {
	//1、獲取接口新聞列表
    List<NewsVO> list = service.queryNews();
    //2、和緩存對比,存數(shù)據(jù)到數(shù)據(jù)庫
}
 
//定義新聞數(shù)據(jù)接口
public interface NewsUtilService {
    List<NewsVO> queryNews();
}
 
//接口的兩個實現(xiàn)類
@Service
public class ANewsDataServiceImpl implements NewsUtilService { 
    @Autowired
	private NewsDataMapper newsDataMapper;
 
    @Override
	public List<NewsVO> queryNews(){
		//對接數(shù)據(jù)
	}
}
 
@Service
public class BNewsDataServiceImpl implements NewsUtilService {
    @Override
	public List<NewsVO> queryNews(){
		//對接數(shù)據(jù)
	}
}
 
//定義工廠類
@Service
public class NewsUtilServiceFactory {	
	/**
	 * 
	 * Method Name:  getNewsUtilService
	 * @param source
	 * @return 
	 */
	public NewsUtilService getNewsUtilService(String source){
		switch(source){
			case "a":
				return new ANewsDataServiceImpl();
			case "b":
				return new BNewsDataServiceImpl();
			default:
				return null;
		}
	}
}
 
//控制層調(diào)用
@RestController
public class NewsDataController {
    @Resource
    private NewsDataService newsDataService;
    
    @Resource
    private NewsUtilServiceFactory factory;
 
    public Object getNewsData(){
        String[] sources = {"a","b"};
    		for (int i = 0; i < sources.length; i++) {
    			NewsUtilService newsUtilService = factory.getNewsUtilService(sources[i]);
    			newsDataService.saveNews(newsUtilService);
			}
    }
}

本來以為這就大工告成了,誰知道運行后控制臺居然報錯了:

經(jīng)過一步步調(diào)試,總算發(fā)現(xiàn)了是什么問題:

其中一個實現(xiàn)類中注入的Mapper沒有實例化,是null。

一開始我還以為是構(gòu)造函數(shù)調(diào)用和注入的順序問題,查了半天才明白不是,問題在這里:

使用new關(guān)鍵字實例化的對象不是被spring創(chuàng)建的,不歸spring管,所以A類實現(xiàn)類中Mapper注入的注解根本不生效!

但是因為業(yè)務(wù)需要,那個mapper又需要用到,怎么辦呢?

當(dāng)時想到了兩種解決辦法

1、在接口的方法參數(shù)里加入mapper,把mapper作為參數(shù)傳進去,但這實在太奇怪了,先不說B類實現(xiàn)類根本用不到mapper,而且一個接口定義出來后根本不管它的實現(xiàn)類吧,因為實現(xiàn)類的問題去改接口,,,似乎有點非呀。

于是決定用第二種,修改工廠類變成如下:

//定義工廠類
@Service
public class NewsUtilServiceFactory {	
    @Autowired
    private ANewsDataServiceImpl aNewsDataServiceImpl;
    @Autowired
    private BNewsDataServiceImpl bNewsDataServiceImpl; 
	public NewsUtilService getNewsUtilService(String source){
		switch(source){
			case "a":
				return aNewsDataServiceImpl;
			case "b":
				return bNewsDataServiceImpl;
			default:
				return null;
		}
	}
}

代碼寫出來自己都無語了,先把所有的實現(xiàn)類都實例化出來,在根據(jù)輸入返回。這不是工廠模式,是商店模式吧。。。但是當(dāng)時也想不到其他辦法,就先這么寫了,但一直覺得肯定有其他解決方案,直到今天有空,去查了一下,才發(fā)現(xiàn)自己都多l(xiāng)ow。。。

其實spring可以動態(tài)獲取實現(xiàn)類的~~~

@Service
public class NewsUtilServiceFactory {	
	@Autowired
	private ApplicationContext applicationContext;	
	public NewsUtilService getNewsUtilService(String source){
		switch(source){
			case "web":
				return applicationContext.getBean(WebNewsDataServiceImpl.class);
			case "oa":
				return applicationContext.getBean(OANewDataServiceImpl.class);
			default:
				return null;
		}
	}
}

這才是正確寫法有木有!

總算弄出來了,趕緊記錄下來先~

獲取某接口所有實現(xiàn)類

在springboot項目中,為了方便,我們可能需要獲取某一個接口下面的所有實現(xiàn)類,根據(jù)名稱進行匹配使用。

正文

1、ServiceLocator.java

package com.yang.config;
import com.yang.workOrder.service.IRootService;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
 * explain:獲取應(yīng)用上下文并獲取相應(yīng)的接口實現(xiàn)類
 *
 * @author yang
 * @date 2021/1/5
 */
@Component
public class ServiceLocator implements ApplicationContextAware {
    /**
     * 用于保存接口實現(xiàn)類名及對應(yīng)的類
     */
    private Map<String, IRootService> map;
    /**
     * 獲取應(yīng)用上下文并獲取相應(yīng)的接口實現(xiàn)類
     * @param applicationContext
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        //根據(jù)接口類型返回相應(yīng)的所有bean
        map = applicationContext.getBeansOfType(IRootService.class);
    }
    /**
     * 獲取所有實現(xiàn)集合
     * @return
     */
    public Map<String, IRootService> getMap() {
        return map;
    }
    /**
     * 獲取對應(yīng)服務(wù)
     * @param key
     * @return
     */
    public IRootService getService(String key) {
        return map.get(key);
    }
}

2、IRootService.java

package com.yang.workOrder.service;
import com.alibaba.fastjson.JSONObject;
import com.yang.workOrder.entity.WorkOrder;
/**
 * explain:基礎(chǔ)流程操作服務(wù)接口
 *
 * @author yang
 * @date 2021/1/5
 */
public interface IRootService {
    /**
     * 開始流程
     * @param workOrder
     * @return
     */
    boolean startProcess(WorkOrder workOrder);
}

3、RootA001ServiceImpl.java

package com.yang.workOrder.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.yang.workOrder.entity.WorkOrder;
import com.yang.workOrder.service.IRootService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
/**
 * explain:A_001流程審批實現(xiàn)類
 *
 * @author yang
 * @date 2021/1/5
 */
@Service("A_001")
public class RootA001ServiceImpl implements IRootService {
    private static final Logger LOGGER = LoggerFactory.getLogger(RootA001ServiceImpl.class);
    @Override
    public boolean startProcess(WorkOrder workOrder) {
        return false;
    }
}

4、RootA002ServiceImpl.java

package com.yang.workOrder.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.yang.workOrder.entity.WorkOrder;
import com.yang.workOrder.service.IRootService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
/**
 * explain:A_002流程審批實現(xiàn)類
 *
 * @author yang
 * @date 2021/1/5
 */
@Service("A_002")
public class RootA002ServiceImpl implements IRootService {
    private static final Logger LOGGER = LoggerFactory.getLogger(RootA002ServiceImpl.class);
    @Override
    public boolean startProcess(WorkOrder workOrder) {
        return false;
    }
}

結(jié)果

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot中時間類型 序列化、反序列化、格式處理示例代碼

    SpringBoot中時間類型 序列化、反序列化、格式處理示例代碼

    這篇文章主要介紹了SpringBoot中時間類型 序列化、反序列化、格式處理示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java定時器例子_動力節(jié)點Java學(xué)院整理

    Java定時器例子_動力節(jié)點Java學(xué)院整理

    本文給大家分享了java定時器例子,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧
    2017-05-05
  • Spring整合ehCache全過程

    Spring整合ehCache全過程

    這篇文章主要介紹了Spring整合ehCache全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java發(fā)送報文與接收報文的實例代碼

    Java發(fā)送報文與接收報文的實例代碼

    這篇文章主要介紹了Java發(fā)送報文與接收報文,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 淺談fastjson的常用使用方法

    淺談fastjson的常用使用方法

    下面小編就為大家?guī)硪黄獪\談fastjson的常用使用方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • SpringBoot 中使用RabbtiMq?詳解

    SpringBoot 中使用RabbtiMq?詳解

    這篇文章主要介紹了SpringBoot 中使用RabbtiMq詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價價值,需要的朋友可以參考一下
    2022-07-07
  • 微信公眾號支付(二)實現(xiàn)統(tǒng)一下單接口

    微信公眾號支付(二)實現(xiàn)統(tǒng)一下單接口

    本篇文章主要給大家介紹調(diào)用微信公眾支付的統(tǒng)一下單API,通過參數(shù)封裝為xml格式并發(fā)送到微信給的接口地址就可以獲得返回內(nèi)容,需要的朋友可以參考下本文
    2015-09-09
  • JDK14性能管理工具之jstack使用介紹

    JDK14性能管理工具之jstack使用介紹

    jstack工具主要用來打印java堆棧信息,主要是java的class名字,方法名,字節(jié)碼索引,行數(shù)等信息。這篇文章主要介紹了JDK14性能管理工具之jstack使用介紹,需要的朋友可以參考下
    2020-05-05
  • 學(xué)會Pulsar Consumer的使用方式

    學(xué)會Pulsar Consumer的使用方式

    這篇文章主要介紹了Pulsar Consumer的使用方式,全文使用大量的代碼來做了詳細的講解,感興趣的小伙伴可以參考一下這篇文章,希望讀完能對你有很大的幫助
    2021-08-08
  • Maven編譯Fatal?error?compiling:無效的目標(biāo)發(fā)行版:11問題及解決

    Maven編譯Fatal?error?compiling:無效的目標(biāo)發(fā)行版:11問題及解決

    在Java11中編譯Springboot工程時遇到問題,解決方法是在pom.xml文件中指定Maven的Java編譯器版本,可以使用MavenJava編譯器屬性或插件,在Java9及以后的版本中,也要使用插件并設(shè)置release屬性
    2024-12-12

最新評論

昭觉县| 乌审旗| 阳江市| 庆阳市| 太康县| 定边县| 嵩明县| 凉城县| 静宁县| 房产| 临泉县| 山丹县| 庐江县| 库伦旗| 榕江县| 五指山市| 集安市| 偏关县| 正安县| 明水县| 瑞金市| 绥阳县| 焉耆| 哈巴河县| 三江| 南江县| 灵山县| 沁水县| 汤原县| 南通市| 衡东县| 武夷山市| 东乡县| 宜良县| 栖霞市| 桓台县| 平遥县| 富川| 武义县| 高邮市| 东安县|