Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
欲善其事,必先利其器!
就在不久之前,Java領(lǐng)域的開(kāi)發(fā)神器IntelliJ IDEA終于迎來(lái)2021年的一個(gè)重要的大版本更新:IntelliJ IDEA 2021.1。
現(xiàn)如今大量的Java開(kāi)發(fā)者深度依賴著這款開(kāi)發(fā)軟件,正如網(wǎng)上的段子所言:“可以毫不夸張地說(shuō),多少Java程序員離開(kāi)了IDEA就不會(huì)寫代碼了(狗頭)”,由此可見(jiàn)其使用的廣泛程度。
新版本一出來(lái),我也迫不及待地想嘗試一番。當(dāng)然,主力開(kāi)發(fā)機(jī)我是不敢亂升級(jí)的,所以這兩天,我在一臺(tái)平時(shí)用來(lái)做測(cè)試的老開(kāi)發(fā)本子上更新了全新的IDEA。
軟件啟動(dòng)界面打開(kāi)的那一瞬間,我就知道事情并不簡(jiǎn)單。
更新后,全新的啟動(dòng)頁(yè)面更加花里胡哨了。
軟件啟動(dòng)速度也是非常之快,就我這多年苦練的火箭般手速,都差點(diǎn)沒(méi)截來(lái)下面這張啟動(dòng)頁(yè)面圖。
JetBrains提供的Space這個(gè)功能不知道大家有沒(méi)有聽(tīng)說(shuō)過(guò),講白了就是一套集成的團(tuán)隊(duì)協(xié)作環(huán)境,可以提供包括構(gòu)建交付、聊天協(xié)作、團(tuán)隊(duì)管理以及項(xiàng)目管理等在內(nèi)的一整套協(xié)作一體化解決方案。
最新的IDEA 2021.1把Space環(huán)境給無(wú)縫地集成進(jìn)來(lái)了,現(xiàn)在屬于開(kāi)箱即用的狀態(tài),軟件的右上角就有快捷入口:
這個(gè)功能相信對(duì)于很多依賴Windows系統(tǒng)以及WSL功能的用戶來(lái)說(shuō),簡(jiǎn)直是喜大普奔!
以前WSL就算再好用,但是你的IDE并沒(méi)有和它打通,多少總是一個(gè)遺憾。
這下好了,二者直接打通了,IDEA支持WSL 2。你可以直接在新版IDEA 2021.1中運(yùn)行并開(kāi)發(fā)WSL 2中的Java項(xiàng)目,包括Gradle類型項(xiàng)目和Maven類型等項(xiàng)目均支持。
Run Targets這個(gè)功能的意思有點(diǎn)類似于上面剛聊過(guò)的WSL 2。它允許開(kāi)發(fā)者直接在遠(yuǎn)程主機(jī)甚至在Docker容器上運(yùn)行和調(diào)試項(xiàng)目。
所以到目前為止,新版IDEA 2021允許開(kāi)發(fā)者可以在本地、WSL 2、SSH遠(yuǎn)程主機(jī)、Docker等目標(biāo)上運(yùn)行項(xiàng)目,可以說(shuō)賊香了!
這也算是一個(gè)比較重磅的更新。
近兩年來(lái),Java版本的發(fā)布速度也是快如老狗,我還在用Java 8,它都淦到Java 16了。
關(guān)于Java 16的新特性,我還準(zhǔn)備寫篇文章來(lái)詳細(xì)聊一聊呢,包括比如:
這次IDEA 2021版的一個(gè)很重要的更新就是加入了對(duì)Java 16的基本支持,注意是基本支持。
除此之外IDEA還新增了幾項(xiàng)檢查機(jī)制,典型比如更加智能的數(shù)據(jù)流分析檢查。
鏈?zhǔn)綐?gòu)造方式的優(yōu)化格式設(shè)置等等。
目的都是為了幫助提升可讀性,進(jìn)一步提升用戶體驗(yàn)。
Code With Me是一項(xiàng)用于協(xié)作開(kāi)發(fā)與結(jié)對(duì)編程的服務(wù),可以實(shí)Host-Guest模式的“手摸手”(滑稽)結(jié)對(duì)編程和群體編程。
目前,新版IDEA開(kāi)箱即用地支持了Code With Me功能,同時(shí)它還具有音頻通話和視頻通話功能,可以滿足隨時(shí)隨地的溝通需求,這操作簡(jiǎn)直騷到爆。
版本控制
版本控制這一塊目前做了不少的更新,包括可以更快地完成PR的創(chuàng)建提交,支持PR模板。
變更提交至代碼庫(kù)前的自定義代碼檢查配置。
以及支持自定義Git提交模板等等。
以前在IDEA中預(yù)覽網(wǎng)頁(yè)得跳到外部瀏覽器,而現(xiàn)如今IDE的編輯器內(nèi)部就支持Built-in級(jí)別的網(wǎng)頁(yè)預(yù)覽,只需要在右上角點(diǎn)那個(gè)IDEA小圖標(biāo)即可激活,而且可以編輯網(wǎng)頁(yè)源碼時(shí)做到同步更新和預(yù)覽。
在Windows平臺(tái)的新版IDEA上,可直接在任務(wù)欄(或開(kāi)始菜單)上右鍵快捷呼出最近使用的項(xiàng)目。
講白了,就是使搜索范圍更易于自定義,我們可以直接在設(shè)置中進(jìn)行Scope定義,自行選擇External Dependencies的范圍是否包含。
當(dāng)你對(duì)編輯器里的多個(gè)文件進(jìn)行垂直窗口拆分時(shí),雙擊某個(gè)Tab就可以將當(dāng)前文件窗口最大化,再次雙擊Tab則會(huì)還原。
當(dāng)然除了這些之外,新版IDEA還新增了很多更新和增強(qiáng),比如:對(duì)Kotlin、Scala、JavaScript等語(yǔ)言的開(kāi)發(fā)優(yōu)化、對(duì)常見(jiàn)框架與技術(shù)的優(yōu)化和支持、對(duì)Kubernetes和Docker的更新支持和改進(jìn)、數(shù)據(jù)庫(kù)工具的更新支持等等,由于時(shí)間有限,在此就不一一贅述了,有需要的可以按需細(xì)究。
最后,讓我們一起大喊一句:“IDEA,yyds!”
Java代碼的時(shí)候,經(jīng)常會(huì)涉及到重復(fù)性的操作,這個(gè)時(shí)候就會(huì)想要是有這樣一個(gè)插件就好了,如果是大家都會(huì)遇到的場(chǎng)景,IDE或許已經(jīng)提供了,再不然也有可能有人編寫了相關(guān)的插件。
要是這個(gè)操作是你們的編碼環(huán)境特有的,那就只能自己寫工具了。所以這里來(lái)學(xué)學(xué)如何編寫IDEA插件,讓自己的編程環(huán)境更加強(qiáng)大,更好的進(jìn)行裝x。
開(kāi)發(fā)IDEA插件有以下這些依賴:
你可能已經(jīng)安裝了Ultimate版本,但是你還是需要安裝[IDEA][]的社區(qū)版本。因?yàn)樯虡I(yè)版是閉源的,所以在調(diào)試時(shí)無(wú)法調(diào)試核心代碼。
社區(qū)版的安裝包里是不包含源碼的,所以我們需要手動(dòng)從github上clone一份:
git clone --depth 1 git://git.jetbrains.org/idea/community.git idea
關(guān)于從源碼運(yùn)行IDEA的方法參考 Check Out And Build Community Edition:
http://www.jetbrains.org/intellij/sdk/docs/basics/checkout_and_build_community.html
雖然不知道原因,但是根據(jù)Check Out And Build Community Edition:
http://www.jetbrains.org/intellij/sdk/docs/basics/checkout_and_build_community.html
我們需要建立一個(gè) IDEA jdk來(lái)運(yùn)行插件:
除非你在Mac上使用官方JDK,否則你需要手動(dòng)添加 /lib/tools.jar到classpath中。關(guān)注微信公眾號(hào):匠心零度,在后臺(tái)回復(fù):idea,可以獲取我整最新 IDEA 教程,都是干貨。
打開(kāi) File|ProjectStructure新建一個(gè) IntelliJPlatformSDK:
Java SDK選擇我們剛剛建立的 IDEA jdk:
然后我們可以把下載的IDEA社區(qū)版源碼添加到源碼路徑中,這樣在調(diào)試時(shí),就可以調(diào)試IDEA自身的代碼了:
我們來(lái)編寫一個(gè)最簡(jiǎn)單的插件來(lái)學(xué)習(xí)編寫一個(gè)插件的完整步驟。
選擇 IntellJPlatformPlugin,然后Project SDK指定剛剛新建的plugin sdk:
新建的插件項(xiàng)目:
插件根目錄下有兩個(gè)目錄 src和 resources。src是插件代碼目錄, resource是插件資源目錄,其中 META-INF/plugin.xml是插件的描述文件,就像Java web項(xiàng)目的 web.xml一樣。
plugin.xml默認(rèn)的內(nèi)容如下:
<idea-plugin> <id>com.your.company.unique.plugin.id</id> <name>Plugin display name here</name> <version>1.0</version> <vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor> <description><!\[CDATA\[ Enter short description for your plugin here.<br> <em>most HTML tags may be used</em> \]\]></description> <change-notes><!\[CDATA\[ Add change notes here.<br> <em>most HTML tags may be used</em> \]\]> </change-notes> <!\-\- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting\_started/build\_number_ranges.html for description --> <idea-version since-build="145.0"/> <!\-\- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting\_started/plugin\_compatibility.html on how to target different products --> <!\-\- uncomment to enable plugin in all products <depends>com.intellij.modules.lang</depends> --> <extensions defaultExtensionNs="com.intellij"> <!\-\- Add your extensions here --> </extensions> <actions> <!\-\- Add your actions here --> </actions> </idea-plugin>
插件擴(kuò)展IDEA最常見(jiàn)的方式就是在菜單欄或者工具欄中添加菜單項(xiàng),用戶通過(guò)點(diǎn)擊菜單項(xiàng)來(lái)觸發(fā)插件功能。IDEA提供了 AnAction類,這個(gè)類有一個(gè)虛方法 actionPerformed,這個(gè)方法會(huì)在每次菜單被點(diǎn)擊時(shí)調(diào)用。
新建一個(gè)自定義的Action有兩個(gè)步驟:
1、 繼承 AnAction類,在 actionPerformed方法中實(shí)現(xiàn)插件邏輯 2、 注冊(cè)action,有兩種方式,通過(guò)代碼注冊(cè)和通過(guò) plugin.xml注冊(cè)
我們先寫一個(gè)簡(jiǎn)單的Action類:
publicclass TextBoxes extends AnAction { // 如果通過(guò)Java代碼來(lái)注冊(cè),這個(gè)構(gòu)造函數(shù)會(huì)被調(diào)用,傳給父類的字符串會(huì)被作為菜單項(xiàng)的名稱 // 如果你通過(guò)plugin.xml來(lái)注冊(cè),可以忽略這個(gè)構(gòu)造函數(shù) public TextBoxes() { // 設(shè)置菜單項(xiàng)名稱 super("Text _Boxes"); // 還可以設(shè)置菜單項(xiàng)名稱,描述,圖標(biāo) // super("Text _Boxes","Item description",IconLoader.getIcon("/Mypackage/icon.png")); } public void actionPerformed(AnActionEvent event) { Project project = event.getData(PlatformDataKeys.PROJECT); String txt= Messages.showInputDialog(project, "What is your name?", "Input your name", Messages.getQuestionIcon()); Messages.showMessageDialog(project, "Hello, " \+ txt + "!\n I am glad to see you.", "Information", Messages.getInformationIcon()); } }
然后我們?cè)?plugin.xml中注冊(cè)這個(gè)Action:
<actions> <group id="MyPlugin.SampleMenu" text="_Sample Menu" description="Sample menu"> <add-to-group group-id="MainMenu" anchor="last" /> <action id="Myplugin.Textboxes"class="Mypackage.TextBoxes" text="Text _Boxes" description="A test menu item" /> </group> </actions>
這里我們新建了一個(gè)菜單組,其中text字符串的下劃線表示這個(gè)字母作為快捷鍵。這個(gè)菜單顯示的效果如下:
除了手動(dòng)新建Action,IDEA還提供了快速新建的方法,在代碼目錄上點(diǎn)擊新建,可以看到Action:
可以在這個(gè)面板中填寫你要新建的Action信息,IDEA會(huì)幫你新建類,還有在plugin.xml中幫你注冊(cè):
運(yùn)行插件特別簡(jiǎn)單,和運(yùn)行普通Java代碼一樣,點(diǎn)擊運(yùn)行或者調(diào)試的按鈕,就會(huì)啟動(dòng)一個(gè)新的IDEA實(shí)例,這個(gè)實(shí)例中插件是生效的。
點(diǎn)擊Text Boxes就可以看到插件的效果了。
EasyCode是一款專為IntelliJ IDEA設(shè)計(jì)的代碼生成工具插件,旨在通過(guò)自動(dòng)化和模板化的方式,極大地提高Java開(kāi)發(fā)者的編碼效率和代碼質(zhì)量。這款插件深度融合于IDEA的開(kāi)發(fā)環(huán)境中,為開(kāi)發(fā)者帶來(lái)全新的開(kāi)發(fā)體驗(yàn),讓編程變得更加輕松愉快。
優(yōu)點(diǎn):
缺點(diǎn):
綜上所述,EasyCode作為一款高效的IDEA插件,通過(guò)自動(dòng)化和模板化的方式,為Java開(kāi)發(fā)者帶來(lái)了極大的便利和效率提升。盡管存在一些缺點(diǎn),但在大多數(shù)情況下,它仍然是提高開(kāi)發(fā)效率、保持代碼一致性的有力工具。
?
其實(shí)這么古老的插件大家應(yīng)該都知道,我就簡(jiǎn)單講述一下。并且逆向生成也有很多的方式,這篇文章主要是記錄下生成的模板配置信息,方便后續(xù)使用。
image.png
1.通過(guò)IDEA自帶的數(shù)據(jù)庫(kù)工具連接上數(shù)據(jù)庫(kù)
image.png
image.png
2.配置EasyCode生成的模板
*注:點(diǎn)擊上面的+是創(chuàng)建分組,輸入分組名創(chuàng)建后點(diǎn)擊里面的+是創(chuàng)建該分組的模板,后續(xù)生成的時(shí)候選擇其分組就行
3.選擇數(shù)據(jù)表,鼠標(biāo)右鍵選擇EasyCode來(lái)生成模板
image.png
image.png
*注:Package和Path選到要生成的模塊級(jí)就行了(模塊包名會(huì)根據(jù)模板自動(dòng)創(chuàng)建,不要自己去創(chuàng)),比如:xxx/src/main/java/com/xx/包名
##定義初始變量
#set($tableName = $tool.append($tableInfo.name, "Controller"))
##設(shè)置回調(diào)
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/controller"))
##拿到主鍵
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import $!{tableInfo.savePackageName}.common.R;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import java.io.Serializable;
import java.util.List;
/**
* $!{tableInfo.comment}($!{tableInfo.name})控制層
*
* @author ycc
* @since $!time.currTime()
*/
@RestController
@RequestMapping("$!tool.firstLowerCase($tableInfo.name)")
public class $!{tableName} {
/**
* 服務(wù)對(duì)象
*/
@Resource
private $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service;
/**
* 分頁(yè)查詢所有數(shù)據(jù)
*/
@GetMapping
public R page(@RequestParam int current,@RequestParam int size){
Page<$!{tableInfo.name}> page=new Page<>(current,size);
return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.page(page));}
/**
* 通過(guò)主鍵查詢單條數(shù)據(jù)
*/
@GetMapping("{id}")
public R selectOne(@PathVariable Serializable id){
return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.getById(id));}
/**
* 新增數(shù)據(jù)
*/
@PostMapping
public R save(@RequestBody $!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name)){
return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.save($!tool.firstLowerCase($tableInfo.name)));}
/**
* 修改數(shù)據(jù)
*/
@PutMapping
public R updateById(@RequestBody $!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name)){
return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.updateById($!tool.firstLowerCase($tableInfo.name)));}
/**
* 單條/批量刪除數(shù)據(jù)
*/
@DeleteMapping
public R delete(@RequestParam List<Long> id){
return R.ok($!{tool.firstLowerCase($tableInfo.name)}Service.removeByIds(id));
}
}
##定義初始變量
#set($tableName = $tool.append($tableInfo.name, "Service"))
##設(shè)置回調(diào)
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service"))
##拿到主鍵
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;
import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
import com.baomidou.mybatisplus.extension.service.IService;
/**
* $!{tableInfo.comment}($!{tableInfo.name})服務(wù)接口
*
* @author ycc
* @since $!time.currTime()
*/
public interface $!{tableName} extends IService<$!tableInfo.name> {}
##定義初始變量
#set($tableName = $tool.append($tableInfo.name, "ServiceImpl"))
##設(shè)置回調(diào)
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service/impl"))
##拿到主鍵
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.stereotype.Service;
/**
* $!{tableInfo.comment}($!{tableInfo.name})服務(wù)實(shí)現(xiàn)類
*
* @author ycc
* @since $!time.currTime()
*/
@Service
public class $!{tableName} extends ServiceImpl<$!{tableInfo.name}Mapper, $!{tableInfo.name}> implements $!{tableInfo.name}Service {}
##定義初始變量
#set($tableName = $tool.append($tableInfo.name, "Mapper"))
##設(shè)置回調(diào)
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/mapper"))
##拿到主鍵
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import $!{tableInfo.savePackageName}.domain.$!tableInfo.name;
/**
* $!{tableInfo.comment}($!{tableInfo.name})數(shù)據(jù)庫(kù)訪問(wèn)層
*
* @author ycc
* @since $!time.currTime()
*/
@Mapper
public interface $!{tableName} extends BaseMapper<$!tableInfo.name> {}
##引入mybatis支持
$!{mybatisSupport.vm}
##設(shè)置保存名稱與保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.xml"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mapper"))
##拿到主鍵
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="$!{tableInfo.savePackageName}.mapper.$!{tableInfo.name}Mapper">
<resultMap type="$!{tableInfo.savePackageName}.domain.vo.$!{tableInfo.name}VO" id="$!{tableInfo.name}VOMap">
#foreach($column in $tableInfo.fullColumn)
<result property="$!column.name" column="$!column.obj.name" jdbcType="$!column.ext.jdbcType"/>
#end
</resultMap>
</mapper>
##引入宏定義
$!{define.vm}
##使用宏定義設(shè)置回調(diào)(保存位置與文件后綴)
#save("/domain", ".java")
##使用宏定義設(shè)置包后綴
#setPackageSuffix("domain")
##使用全局變量實(shí)現(xiàn)默認(rèn)包導(dǎo)入
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* $!{tableInfo.comment}($!{tableInfo.comment})表
*
* @author ycc
* @since $!time.currTime()
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class $!{tableInfo.name}{
private static final long serialVersionUID= 1L;
#foreach($column in $tableInfo.pkColumn)
#if(${column.comment})/**
* ${column.comment}
*/#end
@TableId(value = "$!{column.obj.name}" , type = IdType.NONE)
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
#foreach($column in $tableInfo.otherColumn)
#if(${column.comment})
/**
* ${column.comment}
*/
#end
@TableField(value = "$!{column.obj.name}")
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
}
##引入宏定義
$!{define.vm}
##使用宏定義設(shè)置回調(diào)(保存位置與文件后綴)
#save("/domain/dto", "DTO.java")
##使用宏定義設(shè)置包后綴
#setPackageSuffix("domain.dto")
import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
##使用全局變量實(shí)現(xiàn)默認(rèn)包導(dǎo)入
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* $!{tableInfo.comment}($!{tableInfo.name})DTO
*
* @author ycc
* @since $!time.currTime()
*/
##使用宏定義實(shí)現(xiàn)類注釋信息
@Data
@NoArgsConstructor
public class $!{tableInfo.name}DTO extends $!{tableInfo.name}{
}
##引入宏定義
$!{define.vm}
##使用宏定義設(shè)置回調(diào)(保存位置與文件后綴)
#save("/domain/vo", "VO.java")
##使用宏定義設(shè)置包后綴
#setPackageSuffix("domain.vo")
import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
##使用全局變量實(shí)現(xiàn)默認(rèn)包導(dǎo)入
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* $!{tableInfo.comment}($!{tableInfo.name})VO
*
* @author ycc
* @since $!time.currTime()
*/
##使用宏定義實(shí)現(xiàn)類注釋信息
@Data
@NoArgsConstructor
public class $!{tableInfo.name}VO extends $!{tableInfo.name}{
}
VO(View Object)、DTO(Data Transfer Object)和DOMAIN(領(lǐng)域模型)是三種常見(jiàn)的用于數(shù)據(jù)傳遞和處理的類型,它們各自在不同的場(chǎng)景下發(fā)揮著重要作用。下面分別解釋它們的區(qū)別和使用場(chǎng)景。
定義:VO通常用于表示視圖層(如JSP、HTML頁(yè)面等)與控制器(Controller)之間的數(shù)據(jù)傳輸對(duì)象。它封裝了需要展示給用戶的數(shù)據(jù),但不包含業(yè)務(wù)邏輯。
使用場(chǎng)景:
定義:DTO是一種設(shè)計(jì)模式,用于在系統(tǒng)不同層(如表現(xiàn)層與業(yè)務(wù)層之間,或微服務(wù)之間的遠(yuǎn)程調(diào)用)之間傳輸數(shù)據(jù)。DTO主要用于封裝跨層或跨系統(tǒng)邊界傳輸?shù)臄?shù)據(jù)。
使用場(chǎng)景:
定義:DOMAIN是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(Domain-Driven Design, DDD)中的一個(gè)核心概念,表示業(yè)務(wù)領(lǐng)域內(nèi)的一組具有業(yè)務(wù)含義和規(guī)則的類及它們之間的關(guān)系。Domain類通常包含業(yè)務(wù)邏輯和狀態(tài)信息。
使用場(chǎng)景:
在實(shí)際項(xiàng)目中,應(yīng)根據(jù)具體需求和場(chǎng)景來(lái)選擇合適的類型,以達(dá)到最佳的開(kāi)發(fā)效率和系統(tǒng)性能。
?
"非常感謝您一直觀看到現(xiàn)在,這些看似基礎(chǔ)的內(nèi)容,實(shí)則構(gòu)建了我們知識(shí)的基石。我驚喜地發(fā)現(xiàn),將這些基礎(chǔ)知識(shí)系統(tǒng)地記錄下來(lái),不僅是對(duì)自我學(xué)習(xí)的一種鞏固,也是一件非常有意義且值得分享的事情。您也完全可以這樣做,讓我們一起在基礎(chǔ)中深耕,發(fā)現(xiàn)更多可能。"
原文:https://juejin.cn/post/7392513123860365339
作者:世界哪有真情
#記錄我的2024#
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。