亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java基礎(chǔ)之教你如何正確運(yùn)用依賴注入

 更新時間:2021年05月14日 16:11:40   作者:林 文  
最近發(fā)現(xiàn)很多使用Spring框架的Java代碼存在依賴注入方式的誤用,甚至是濫用.因此整理了這篇文章,歡迎大家一起探討,需要的朋友可以參考下

一、C++的詬病

C++最遭人詬病的地方就是定義一個類需要寫兩個文件,一個.h文件和一個.cpp文件。例如定義一個CMainFrame類,mainframe.h內(nèi)容如下:

class CMainFrame : public CFrameWndEx
{
protected:
	CMainFrame();
public:
	virtual ~CMainFrame();
};

mainframe.cpp內(nèi)容如下:

CMainFrame::CMainFrame()
{
}
 
CMainFrame::~CMainFrame()
{
}

當(dāng)需要給這個類添加一個方法時,需要同時修改.h文件和.cpp文件。例如新增一個DefWindowProc函數(shù)。需要在.h文件中增加該函數(shù)的聲明。

class CMainFrame : public CFrameWndEx
{
protected:
	CMainFrame();
public:
	virtual ~CMainFrame();
 
protected:
	virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
};

mainframe.cpp中增加DefWindowProc的定義:

LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	if(message==WM_NCPAINT ) 
	{
		if(bShow){
			ShowWindow(SW_SHOW);
		}
		else {
			ShowWindow(SW_HIDE);
		}
	}
 
	return CFrameWndEx::DefWindowProc(message, wParam, lParam);
}

可以看出C++的類定義代碼中,一次變化需要修改兩個文件,其維護(hù)的繁瑣令人詬病。

二、Java的改進(jìn)

然而Java的出現(xiàn)徹底解決了這個問題,一個類就對應(yīng)一個.java文件(包括后來其他面向?qū)ο笳Z言也秉承了這個思路,比如C#)。

比如一個LogService類用于對日志進(jìn)行維護(hù),起初只包含日志的增刪功能,LogService.java代碼如下。

public class LogService{
	public ServiceResult<Boolean> addLog (SysLogInfo logInfo) {
		......
	}
 
	public ServiceResult<Boolean> delLog (String id) {
		......
	}
}

當(dāng)需要增加一個updateLog方法時,僅需對LogService.java進(jìn)行修改。

public class LogService{
	public ServiceResult<Boolean> addLog (SysLogInfo logInfo) {
		......
	}
 
	public ServiceResult<Boolean> delLog(String id) {
		......
	}
 
	public ServiceResult<Boolean> updateLog (SysLogInfo logInfo) {
		......
	}
 
}

一切變得方便了很多。

三、誤用導(dǎo)致的退步

但是最近在看一些基于Spring(SpringBoot、SpringMVC)框架寫的代碼時,發(fā)現(xiàn)很多類的代碼又回到了C++的形式。例如在使用一個LogService時,開發(fā)人員首先定義了一個interface,在LogService.java中:

public interface LogService {
	ServiceResult<Boolean> addLog(SysLogInfo logInfo);
	ServiceResult<Boolean> delLog(String id);
}

然后定義了一個該接口的實(shí)現(xiàn)類,在LogServiceImpl.java中:

public class LogServiceImpl implements LogService{
	
	@Override
	public ServiceResult<Boolean> addLog(SysLogInfo logInfo) {
		......		
	}
 
	@Override
	public ServiceResult<Boolean> delLog(String id) {
		......
	}
}

在需要實(shí)例化這個類的地方用了一個@Autowired注解注入。

public class LogController {
	@Autowired
	private LogService logservice;
}

在問及開發(fā)人員為什么要象這樣做時,其給了一個自信的回答:這是面向接口編程!

注意:這個設(shè)計中LogService.java類似于C++中的.h文件,LogServiceImpl.java類似于C++中的.cpp文件,這兩個文件共同定義了一個LogService類。當(dāng)需要給這個類添加一個updateLog方法時,LogService.java和LogServiceImpl.java都需要被修改,又走回了C++的老路。這顯然是對面向接口編程的曲解。如果這樣都能算面向接口編程的話,那么C++就成了一門天然的面向接口編程的語言,還何必去學(xué)那些復(fù)雜的設(shè)計模式。

不過這樣寫代碼有什么問題嗎?其實(shí)也沒有太大問題,只是代碼繁瑣一點(diǎn)而已(C++就是這樣的)。只不過既然你選擇了Java語言,卻又寫成了C++的樣子,就好像在開一輛自動擋的汽車,卻一直撥到手動模式駕駛一樣。

四、正確理解面向接口編程

那么什么才是面向接口編程呢,其要點(diǎn)在于:接口是基于變化的抽象。在有可能變化的地方才需要接口。假設(shè)上面的例子中,寫日志的動作同時存在3種不同的實(shí)現(xiàn):

1.寫到日志文件。

2.寫到數(shù)據(jù)庫。

3.寫到本地的一個日志服務(wù)的UDP端口。

那么可以基于這個接口寫3個不同的實(shí)現(xiàn)類:

public class LogServiceFile implements LogService{
}
public class LogServiceDB implements LogService{
}
public class LogServiceUdp implements LogService{
}

當(dāng)然此時如果還是使用下面的代碼會報錯,因?yàn)锳utowired只能裝配對應(yīng)接口的唯一一個派生類的Bean,而此時存在3個派生類。

public class LogController {
	@Autowired
	private LogService logservice;
}

需要改進(jìn)成類似下面這個樣子,根據(jù)實(shí)際情況使用對應(yīng)的派生類對象:

public class LogController {
	private LogService logservice;
	void writeLog(SysLogInfo logInfo){
		logservice = GetLogServiceInst();
		logservice.addLog(logInfo);
	}
}

如果你的接口只有一個實(shí)現(xiàn)類,而且在可以遇見的將來也不會有其他實(shí)現(xiàn)類,那么還是建議你能簡化一點(diǎn),采用最基本的類定義方式,減少代碼的復(fù)雜性。

到此這篇關(guān)于教你如何正確運(yùn)用Java依賴注入的文章就介紹到這了,更多相關(guān)Java依賴注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java版C語言版簡單使用靜態(tài)語言實(shí)現(xiàn)動態(tài)數(shù)組的方法

    Java版C語言版簡單使用靜態(tài)語言實(shí)現(xiàn)動態(tài)數(shù)組的方法

    本文給大家分享java版和C語言版簡單使用靜態(tài)語言實(shí)現(xiàn)動態(tài)數(shù)組的方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-10-10
  • SpringBoot 項目使用hutool 工具進(jìn)行 http 接口調(diào)用的處理方法

    SpringBoot 項目使用hutool 工具進(jìn)行 http 接口調(diào)用的處理方

    在實(shí)際的開發(fā)過程中一個互聯(lián)網(wǎng)的項目來說 ,有可能會涉及到調(diào)用外部接口的實(shí)際業(yè)務(wù)場景,下面通過本文給大家介紹SpringBoot 項目 使用hutool 工具進(jìn)行 http 接口調(diào)用的處理方法,需要的朋友可以參考下
    2022-06-06
  • 一文秒懂IDEA中每天都在用的Project Structure知識

    一文秒懂IDEA中每天都在用的Project Structure知識

    這篇文章主要介紹了一文秒懂IDEA中每天都在用的Project Structure知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • java支付寶即時到帳提交訂單功能

    java支付寶即時到帳提交訂單功能

    這篇文章主要為大家詳細(xì)介紹了java支付寶即時到帳提交訂單功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • springboot+swagger2.10.5+mybatis-plus 入門詳解

    springboot+swagger2.10.5+mybatis-plus 入門詳解

    這篇文章主要介紹了springboot+swagger2.10.5+mybatis-plus 入門,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Spring的Ioc模擬實(shí)現(xiàn)詳細(xì)介紹

    Spring的Ioc模擬實(shí)現(xiàn)詳細(xì)介紹

    這篇文章主要介紹了Spring的Ioc模擬實(shí)現(xiàn)詳細(xì)介紹,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • mybatis?@InsertProvider報錯問題及解決

    mybatis?@InsertProvider報錯問題及解決

    這篇文章主要介紹了mybatis?@InsertProvider報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Spring Cache手動清理Redis緩存

    Spring Cache手動清理Redis緩存

    這篇文章主要介紹了Spring Cache手動清理Redis緩存,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • MyBatis動態(tài)<if>標(biāo)簽的使用

    MyBatis動態(tài)<if>標(biāo)簽的使用

    本文主要介紹了MyBatis動態(tài)<if>標(biāo)簽的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Kotlin基礎(chǔ)教程之操作符與操作符重載

    Kotlin基礎(chǔ)教程之操作符與操作符重載

    這篇文章主要介紹了Kotlin基礎(chǔ)教程之操作符與操作符重載的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評論