91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么正確地使用依賴注入

發布時間:2022-02-28 10:53:55 來源:億速云 閱讀:186 作者:小新 欄目:開發技術

小編給大家分享一下Java怎么正確地使用依賴注入,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一、C++的詬病

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

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

mainframe.cpp內容如下:

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

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

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++的類定義代碼中,一次變化需要修改兩個文件,其維護的繁瑣令人詬病。

二、Java的改進

然而Java的出現徹底解決了這個問題,一個類就對應一個.java文件(包括后來其他面向對象語言也秉承了這個思路,比如C#)。

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

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

當需要增加一個updateLog方法時,僅需對LogService.java進行修改。

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

一切變得方便了很多。

三、誤用導致的退步

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

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

然后定義了一個該接口的實現類,在LogServiceImpl.java中:

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

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

public class LogController {
	@Autowired
	private LogService logservice;
}

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

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

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

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

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

1.寫到日志文件。

2.寫到數據庫。

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

那么可以基于這個接口寫3個不同的實現類:

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

當然此時如果還是使用下面的代碼會報錯,因為Autowired只能裝配對應接口的唯一一個派生類的Bean,而此時存在3個派生類。

public class LogController {
	@Autowired
	private LogService logservice;
}

需要改進成類似下面這個樣子,根據實際情況使用對應的派生類對象:

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

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

以上是“Java怎么正確地使用依賴注入”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沙湾县| 师宗县| 拜泉县| 锡林郭勒盟| 中山市| 广安市| 万山特区| 台江县| 莱芜市| 连云港市| 宜兰县| 改则县| 舟山市| 天柱县| 宝丰县| 突泉县| 阿坝县| 泾源县| 上饶市| 蓬莱市| 申扎县| 阿克| 来安县| 临颍县| 大足县| 理塘县| 永宁县| 延川县| 玉龙| 刚察县| 海南省| 徐闻县| 上饶市| 镇江市| 涞水县| 景宁| 平南县| 永嘉县| 韩城市| 合川市| 昌图县|