在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JMH的DEMO演示和常用的注解參數(shù)

我快閉嘴 ? 來(lái)源:稀土掘金技術(shù)社區(qū) ? 作者:Richard_Yi ? 2022-09-27 10:49 ? 次閱讀

3343897c-3e0b-11ed-9e49-dac502259ad0.jpg

前言

"If you cannot measure it, you cannot improve it".

在日常開(kāi)發(fā)中,我們對(duì)一些代碼的調(diào)用或者工具的使用會(huì)存在多種選擇方式,在不確定他們性能的時(shí)候,我們首先想要做的就是去測(cè)量它。大多數(shù)時(shí)候,我們會(huì)簡(jiǎn)單的采用多次計(jì)數(shù)的方式來(lái)測(cè)量,來(lái)看這個(gè)方法的總耗時(shí)。

但是,如果熟悉JVM類(lèi)加載機(jī)制的話(huà),應(yīng)該知道JVM默認(rèn)的執(zhí)行模式是JIT編譯與解釋混合執(zhí)行。JVM通過(guò)熱點(diǎn)代碼統(tǒng)計(jì)分析,識(shí)別高頻方法的調(diào)用、循環(huán)體、公共模塊等,基于JIT動(dòng)態(tài)編譯技術(shù),會(huì)將熱點(diǎn)代碼轉(zhuǎn)換成機(jī)器碼,直接交給CPU執(zhí)行。

3356404e-3e0b-11ed-9e49-dac502259ad0.jpg

也就是說(shuō),JVM會(huì)不斷的進(jìn)行編譯優(yōu)化,這就使得很難確定重復(fù)多少次才能得到一個(gè)穩(wěn)定的測(cè)試結(jié)果?所以,很多有經(jīng)驗(yàn)的同學(xué)會(huì)在測(cè)試代碼前寫(xiě)一段預(yù)熱的邏輯。

JMH,全稱(chēng) Java Microbenchmark Harness (微基準(zhǔn)測(cè)試框架),是專(zhuān)門(mén)用于Java代碼微基準(zhǔn)測(cè)試的一套測(cè)試工具API,是由 OpenJDK/Oracle 官方發(fā)布的工具。何謂 Micro Benchmark 呢?簡(jiǎn)單地說(shuō)就是在 method 層面上的 benchmark,精度可以精確到微秒級(jí)。

Java的基準(zhǔn)測(cè)試需要注意的幾個(gè)點(diǎn):

  • 測(cè)試前需要預(yù)熱。
  • 防止無(wú)用代碼進(jìn)入測(cè)試方法中。
  • 并發(fā)測(cè)試。
  • 測(cè)試結(jié)果呈現(xiàn)。

JMH的使用場(chǎng)景:

  1. 定量分析某個(gè)熱點(diǎn)函數(shù)的優(yōu)化效果
  2. 想定量地知道某個(gè)函數(shù)需要執(zhí)行多長(zhǎng)時(shí)間,以及執(zhí)行時(shí)間和輸入變量的相關(guān)性
  3. 對(duì)比一個(gè)函數(shù)的多種實(shí)現(xiàn)方式

本篇主要是介紹JMH的DEMO演示,和常用的注解參數(shù)。希望能對(duì)你起到幫助。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

DEMO 演示

這里先演示一個(gè)DEMO,讓不了解JMH的同學(xué)能夠快速掌握這個(gè)工具的大概用法。

1. 測(cè)試項(xiàng)目構(gòu)建

JMH是內(nèi)置Java9及之后的版本。這里是以Java8進(jìn)行說(shuō)明。

為了方便,這里直接介紹使用maven構(gòu)建JMH測(cè)試項(xiàng)目的方式。

第一種是使用命令行構(gòu)建,在指定目錄下執(zhí)行以下命令:

$mvnarchetype:generate
-DinteractiveMode=false
-DarchetypeGroupId=org.openjdk.jmh
-DarchetypeArtifactId=jmh-java-benchmark-archetype
-DgroupId=org.sample
-DartifactId=test
-Dversion=1.0

對(duì)應(yīng)目錄下會(huì)出現(xiàn)一個(gè)test項(xiàng)目,打開(kāi)項(xiàng)目后我們會(huì)看到這樣的項(xiàng)目結(jié)構(gòu)。

33670816-3e0b-11ed-9e49-dac502259ad0.jpg

第二種方式就是直接在現(xiàn)有的maven項(xiàng)目中添加jmh-corejmh-generator-annprocess的依賴(lài)來(lái)集成JMH。

<dependency>
<groupId>org.openjdk.jmhgroupId>
<artifactId>jmh-coreartifactId>
<version>${jmh.version}version>
dependency>
<dependency>
<groupId>org.openjdk.jmhgroupId>
<artifactId>jmh-generator-annprocessartifactId>
<version>${jmh.version}version>
<scope>providedscope>
dependency>

2. 編寫(xiě)性能測(cè)試

這里我以測(cè)試LinkedList 通過(guò)index 方式迭代和foreach 方式迭代的性能差距為例子,編寫(xiě)測(cè)試類(lèi),涉及到的注解在之后會(huì)講解。

/**
*@authorRichard_yyf
*@version1.02019/8/27
*/

@State(Scope.Benchmark)
@OutputTimeUnit(TimeUnit.SECONDS)
@Threads(Threads.MAX)
publicclassLinkedListIterationBenchMark{
privatestaticfinalintSIZE=10000;

privateListlist=newLinkedList<>();

@Setup
publicvoidsetUp(){
for(inti=0;i@Benchmark
@BenchmarkMode(Mode.Throughput)
publicvoidforIndexIterate(){
for(inti=0;i"");
}
}

@Benchmark
@BenchmarkMode(Mode.Throughput)
publicvoidforEachIterate(){
for(Strings:list){
System.out.print("");
}
}
}

3. 執(zhí)行測(cè)試

運(yùn)行 JMH 基準(zhǔn)測(cè)試有兩種方式,一個(gè)是生產(chǎn)jar文件運(yùn)行,另一個(gè)是直接寫(xiě)main函數(shù)或者放在單元測(cè)試中執(zhí)行。

生成jar文件的形式主要是針對(duì)一些比較大的測(cè)試,可能對(duì)機(jī)器性能或者真實(shí)環(huán)境模擬有一些需求,需要將測(cè)試方法寫(xiě)好了放在linux環(huán)境執(zhí)行。

具體命令如下

$mvncleaninstall
$java-jartarget/benchmarks.jar

我們?nèi)粘V杏龅降囊话闶且恍┬y(cè)試,比如我上面寫(xiě)的例子,直接在IDE中跑就好了。

啟動(dòng)方式如下:

publicstaticvoidmain(String[]args)throwsRunnerException{
Optionsopt=newOptionsBuilder()
.include(LinkedListIterationBenchMark.class.getSimpleName())
.forks(1)
.warmupIterations(2)
.measurementIterations(2)
.output("E:/Benchmark.log")
.build();

newRunner(opt).run();
}

4. 報(bào)告結(jié)果

輸出結(jié)果如下,

最后的結(jié)果:

BenchmarkModeCntScoreErrorUnits
LinkedListIterationBenchMark.forEachIteratethrpt21192.380ops/s
LinkedListIterationBenchMark.forIndexIteratethrpt2206.866ops/s

整個(gè)過(guò)程:

>基于SpringCloudAlibaba+Gateway+Nacos+RocketMQ+Vue&Element實(shí)現(xiàn)的后臺(tái)管理系統(tǒng)+用戶(hù)小程序,支持RBAC動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
>
>*項(xiàng)目地址:
>*視頻教程

#DetectingactualCPUcount:12detected
#JMHversion:1.21
#VMversion:JDK1.8.0_131,JavaHotSpot(TM)64-BitServerVM,25.131-b11
#VMinvoker:C:ProgramFilesJavajdk1.8.0_131jreinjava.exe
#VMoptions:-javaagentProgramFilesJetBrainsIntelliJIDEA2018.2.2libidea_rt.jar=65175ProgramFilesJetBrainsIntelliJIDEA2018.2.2in-Dfile.encoding=UTF-8
#Warmup:2iterations,10seach
#Measurement:2iterations,10seach
#Timeout:10minperiteration
#Threads:12threads,willsynchronizeiterations
#Benchmarkmode:Throughput,ops/time
#Benchmark:org.sample.jmh.LinkedListIterationBenchMark.forEachIterate

#Runprogress:0.00%complete,ETA0020
#Fork:1of1
#WarmupIteration1:1189.267ops/s
#WarmupIteration2:1197.321ops/s
Iteration1:1193.062ops/s
Iteration2:1191.698ops/s

Result"org.sample.jmh.LinkedListIterationBenchMark.forEachIterate":
1192.380ops/s

#JMHversion:1.21
#VMversion:JDK1.8.0_131,JavaHotSpot(TM)64-BitServerVM,25.131-b11
#VMinvoker:C:ProgramFilesJavajdk1.8.0_131jreinjava.exe
#VMoptions:-javaagentProgramFilesJetBrainsIntelliJIDEA2018.2.2libidea_rt.jar=65175ProgramFilesJetBrainsIntelliJIDEA2018.2.2in-Dfile.encoding=UTF-8
#Warmup:2iterations,10seach
#Measurement:2iterations,10seach
#Timeout:10minperiteration
#Threads:12threads,willsynchronizeiterations
#Benchmarkmode:Throughput,ops/time
#Benchmark:org.sample.jmh.LinkedListIterationBenchMark.forIndexIterate

#Runprogress:50.00%complete,ETA0040
#Fork:1of1
#WarmupIteration1:205.676ops/s
#WarmupIteration2:206.512ops/s
Iteration1:206.542ops/s
Iteration2:207.189ops/s

Result"org.sample.jmh.LinkedListIterationBenchMark.forIndexIterate":
206.866ops/s

#Runcomplete.Totaltime:0021

REMEMBER:Thenumbersbelowarejustdata.Togainreusableinsights,youneedtofollowupon
whythenumbersarethewaytheyare.Useprofilers(see-prof,-lprof),designfactorial
experiments,performbaselineandnegativeteststhatprovideexperimentalcontrol,makesure
thebenchmarkingenvironmentissafeonJVM/OS/HWlevel,askforreviewsfromthedomainexperts.
Donotassumethenumberstellyouwhatyouwantthemtotell.

BenchmarkModeCntScoreErrorUnits
LinkedListIterationBenchMark.forEachIteratethrpt21192.380ops/s
LinkedListIterationBenchMark.forIndexIteratethrpt2206.866ops/s

注解介紹

下面我們來(lái)詳細(xì)介紹一下相關(guān)的注解。

@BenchmarkMode

微基準(zhǔn)測(cè)試類(lèi)型。JMH 提供了以下幾種類(lèi)型進(jìn)行支持:

類(lèi)型 描述
Throughput 每段時(shí)間執(zhí)行的次數(shù),一般是秒
AverageTime 平均時(shí)間,每次操作的平均耗時(shí)
SampleTime 在測(cè)試中,隨機(jī)進(jìn)行采樣執(zhí)行的時(shí)間
SingleShotTime 在每次執(zhí)行中計(jì)算耗時(shí)
All 所有模式

可以注釋在方法級(jí)別,也可以注釋在類(lèi)級(jí)別。

@BenchmarkMode(Mode.All)
publicclassLinkedListIterationBenchMark{
...
}
@Benchmark
@BenchmarkMode({Mode.Throughput,Mode.SingleShotTime})
publicvoidm(){
...
}

@Warmup

這個(gè)單詞的意思就是預(yù)熱,iterations = 3就是指預(yù)熱輪數(shù)。

@Benchmark
@BenchmarkMode({Mode.Throughput,Mode.SingleShotTime})
@Warmup(iterations=3)
publicvoidm(){
...
}

@Measurement

正式度量計(jì)算的輪數(shù)。

  • iterations 進(jìn)行測(cè)試的輪次
  • time 每輪進(jìn)行的時(shí)長(zhǎng)
  • timeUnit時(shí)長(zhǎng)單位
@Benchmark
@BenchmarkMode({Mode.Throughput,Mode.SingleShotTime})
@Measurement(iterations=3)
publicvoidm(){
...
}

@Threads

每個(gè)進(jìn)程中的測(cè)試線(xiàn)程。

@Threads(Threads.MAX)
publicclassLinkedListIterationBenchMark{
...
}

@Fork

進(jìn)行 fork 的次數(shù)。如果 fork 數(shù)是3的話(huà),則 JMH 會(huì) fork 出3個(gè)進(jìn)程來(lái)進(jìn)行測(cè)試。

@Benchmark
@BenchmarkMode({Mode.Throughput,Mode.SingleShotTime})
@Fork(value=3)
publicvoidm(){
...
}

@OutputTimeUnit

基準(zhǔn)測(cè)試結(jié)果的時(shí)間類(lèi)型。一般選擇秒、毫秒、微秒。

@OutputTimeUnit(TimeUnit.SECONDS)
publicclassLinkedListIterationBenchMark{
...
}

@Benchmark

方法級(jí)注解,表示該方法是需要進(jìn)行 benchmark 的對(duì)象,用法和 JUnit 的 @Test 類(lèi)似。

@Param

屬性級(jí)注解,@Param 可以用來(lái)指定某項(xiàng)參數(shù)的多種情況。特別適合用來(lái)測(cè)試一個(gè)函數(shù)在不同的參數(shù)輸入的情況下的性能。

@Setup

方法級(jí)注解,這個(gè)注解的作用就是我們需要在測(cè)試之前進(jìn)行一些準(zhǔn)備工作 ,比如對(duì)一些數(shù)據(jù)的初始化之類(lèi)的。

@TearDown

方法級(jí)注解,這個(gè)注解的作用就是我們需要在測(cè)試之后進(jìn)行一些結(jié)束工作 ,比如關(guān)閉線(xiàn)程池,數(shù)據(jù)庫(kù)連接等的,主要用于資源的回收等。

@State

當(dāng)使用@Setup參數(shù)的時(shí)候,必須在類(lèi)上加這個(gè)參數(shù),不然會(huì)提示無(wú)法運(yùn)行。

就比如我上面的例子中,就必須設(shè)置state

State 用于聲明某個(gè)類(lèi)是一個(gè)“狀態(tài)”,然后接受一個(gè) Scope 參數(shù)用來(lái)表示該狀態(tài)的共享范圍。因?yàn)楹芏?benchmark 會(huì)需要一些表示狀態(tài)的類(lèi),JMH 允許你把這些類(lèi)以依賴(lài)注入的方式注入到 benchmark 函數(shù)里。Scope 主要分為三種。

  1. Thread: 該狀態(tài)為每個(gè)線(xiàn)程獨(dú)享。
  2. Group: 該狀態(tài)為同一個(gè)組里面所有線(xiàn)程共享。
  3. Benchmark: 該狀態(tài)在所有線(xiàn)程間共享。

啟動(dòng)方法

在啟動(dòng)方法中,可以直接指定上述說(shuō)到的一些參數(shù),并且能將測(cè)試結(jié)果輸出到指定文件中,

/**
*僅限于IDE中運(yùn)行
*命令行模式則是build然后java-jar啟動(dòng)
*
*1.這是benchmark啟動(dòng)的入口
*2.這里同時(shí)還完成了JMH測(cè)試的一些配置工作
*3.默認(rèn)場(chǎng)景下,JMH會(huì)去找尋標(biāo)注了@Benchmark的方法,可以通過(guò)include和exclude兩個(gè)方法來(lái)完成包含以及排除的語(yǔ)義
*/
publicstaticvoidmain(String[]args)throwsRunnerException{
Optionsopt=newOptionsBuilder()
//包含語(yǔ)義
//可以用方法名,也可以用XXX.class.getSimpleName()
.include("Helloworld")
//排除語(yǔ)義
.exclude("Pref")
//預(yù)熱10輪
.warmupIterations(10)
//代表正式計(jì)量測(cè)試做10輪,
//而每次都是先執(zhí)行完預(yù)熱再執(zhí)行正式計(jì)量,
//內(nèi)容都是調(diào)用標(biāo)注了@Benchmark的代碼。
.measurementIterations(10)
//forks(3)指的是做3輪測(cè)試,
//因?yàn)橐淮螠y(cè)試無(wú)法有效的代表結(jié)果,
//所以通過(guò)3輪測(cè)試較為全面的測(cè)試,
//而每一輪都是先預(yù)熱,再正式計(jì)量。
.forks(3)
.output("E:/Benchmark.log")
.build();

newRunner(opt).run();
}

結(jié)語(yǔ)

基于JMH可以對(duì)很多工具和框架進(jìn)行測(cè)試,比如日志框架性能對(duì)比、BeanCopy性能對(duì)比 等,更多的example可以參考官方給出的JMH samples(https://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/)



審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2986

    瀏覽量

    107084
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    160

    瀏覽量

    12536

原文標(biāo)題:別再寫(xiě) main 方法測(cè)試了,太 Low!這才是專(zhuān)業(yè) Java 測(cè)試方法!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何通過(guò)注解來(lái)優(yōu)化我們的Java代碼

    Java注解可以說(shuō)是我們編碼過(guò)程中最常用的。本篇文章將給大家介紹Java注解的概念、作用以及如何使用注解來(lái)提升代碼的可讀性和靈活性,并介紹如何通過(guò)
    的頭像 發(fā)表于 09-30 11:39 ?889次閱讀

    【HarmonyOS IPC 試用連載 】開(kāi)箱+DEMO演示

    釘,然后再裝。 注意:鏍釘先別扭緊,調(diào)好焦后再扭緊。組裝搞定,可以開(kāi)始搞機(jī)了!3.demo演示 1)出廠(chǎng)程序DEMO演示依據(jù)說(shuō)明文檔。掃描二維碼下載手機(jī)APP。安裝APP(P6SLit
    發(fā)表于 10-23 00:40

    HarmonyOS注解的使用方法分享

    ; }}運(yùn)行項(xiàng)目報(bào)錯(cuò):缺少get方法! 類(lèi)名:com.example.annotation.demo.Person 參數(shù)名:age
    發(fā)表于 03-28 14:04

    PWM_Demo:F280x PWM 功能演示應(yīng)用程序

    PWM_Demo:F280x PWM 功能演示應(yīng)用程序
    發(fā)表于 04-10 14:33 ?8次下載

    基于TX4101制作的DEMO演示

    基本描述: 本 DEMO 為 TX4101 制作的演示板,用于 DC 輸入4.2-5.0V,輸出電壓 3.3V,輸出電流 600mA 的應(yīng)用演示,最高轉(zhuǎn)換效率高達(dá) 93%。 本電路固定工作頻率是:1MHz。輸出 3.3V/600
    發(fā)表于 05-07 14:58 ?612次閱讀
    基于TX4101制作的<b class='flag-5'>DEMO</b><b class='flag-5'>演示</b>板

    基于TX4205制作的DEMO演示

    DEMO 為 TX4205 制作的演示板,用于 DC 輸入 3.6-5.0V,輸出恒壓12V,輸出電流 1A 的應(yīng)用演示,最高轉(zhuǎn)換效率高達(dá) 87%。
    發(fā)表于 05-11 11:10 ?745次閱讀
    基于TX4205制作的<b class='flag-5'>DEMO</b><b class='flag-5'>演示</b>板

    基于TX6410制作的DEMO演示

    DEMO 為 TX6410 制作的演示板,用于 DC 輸入 12-24V,多種電壓輸出, 輸出電流 350mA 的應(yīng)用演示,最高轉(zhuǎn)換效率高達(dá) 88%。 本電路實(shí)現(xiàn)了線(xiàn)性降壓恒流功能
    的頭像 發(fā)表于 05-11 11:36 ?1773次閱讀
    基于TX6410制作的<b class='flag-5'>DEMO</b><b class='flag-5'>演示</b>板

    Spring Boot常用注解與使用方式

    企業(yè)開(kāi)發(fā)項(xiàng)目SpringBoot已經(jīng)是必備框架了,其中注解是開(kāi)發(fā)中的小工具(誰(shuí)處可見(jiàn)哦),用好了開(kāi)發(fā)效率大大提升,當(dāng)然用錯(cuò)了也會(huì)引入缺陷。
    的頭像 發(fā)表于 07-08 10:57 ?1654次閱讀

    SpringBoot常用注解及使用方法1

    基于 SpringBoot 平臺(tái)開(kāi)發(fā)的項(xiàng)目數(shù)不勝數(shù),與常規(guī)的基于`Spring`開(kāi)發(fā)的項(xiàng)目最大的不同之處,SpringBoot 里面提供了大量的注解用于快速開(kāi)發(fā),而且非常簡(jiǎn)單,基本可以做到開(kāi)箱即用! 那 SpringBoot 為開(kāi)發(fā)者提供了多少注解呢?我們?cè)撊绾问褂?/div>
    的頭像 發(fā)表于 04-07 11:51 ?880次閱讀

    SpringBoot常用注解及使用方法2

    基于 SpringBoot 平臺(tái)開(kāi)發(fā)的項(xiàng)目數(shù)不勝數(shù),與常規(guī)的基于Spring開(kāi)發(fā)的項(xiàng)目最大的不同之處,SpringBoot 里面提供了大量的注解用于快速開(kāi)發(fā),而且非常簡(jiǎn)單,基本可以做到開(kāi)箱即用!
    的頭像 發(fā)表于 04-07 11:52 ?844次閱讀

    Springboot常用注解合集

    前幾章,在系統(tǒng)啟動(dòng)類(lèi)里面,都加入了此啟動(dòng)注解,此注解是個(gè)組合注解,包括了`@SpringBootConfiguration`、`@EnableAutoConfiguration`和`@ComponentScan`
    的頭像 發(fā)表于 04-07 14:27 ?958次閱讀
    Springboot<b class='flag-5'>常用</b><b class='flag-5'>注解</b>合集

    SpringBoot常用注解及原理

    SpringBootConfiguration繼承自@Configuration,二者功能也一致,標(biāo)注當(dāng)前類(lèi)是配置類(lèi), 并會(huì)將當(dāng)前類(lèi)內(nèi)聲明的一個(gè)或多個(gè)以@Bean注解標(biāo)記的方法的實(shí)例納入到spring容器中,并且實(shí)例名就是方法名。
    的頭像 發(fā)表于 04-07 14:30 ?743次閱讀

    JAVA中注解是怎么做到的(上)

    注解想必大家在項(xiàng)目中經(jīng)常使用,比如Spring框架中常用的一些注解:`@Controller`、`@Service`、`@RequestMapping`等等,它是JDK1.5及以后版本引入的一個(gè)特性
    的頭像 發(fā)表于 05-11 10:57 ?825次閱讀

    JAVA中注解是怎么做到的(下)

    注解想必大家在項(xiàng)目中經(jīng)常使用,比如Spring框架中常用的一些注解:`@Controller`、`@Service`、`@RequestMapping`等等,它是JDK1.5及以后版本引入的一個(gè)特性
    的頭像 發(fā)表于 05-11 10:57 ?736次閱讀
    JAVA中<b class='flag-5'>注解</b>是怎么做到的(下)

    springmvc常用5種注解

    SpringMVC是一種基于Java的Web框架,使用注解可以更加方便靈活地開(kāi)發(fā)和管理控制器,實(shí)現(xiàn)請(qǐng)求的映射和處理。在SpringMVC中,有許多常用注解,本文將詳細(xì)介紹其中的五種注解
    的頭像 發(fā)表于 11-22 16:51 ?1249次閱讀
    主站蜘蛛池模板: 综合久久2o19| 天天干视频在线观看 | 欧美亚洲韩国国产综合五月天 | 日本xxxx色视频在线观看免 | 色狠狠网| 午夜黄大色黄大片美女图片 | 高清在线免费观看 | 天天撸夜夜操 | 国产激情视频一区二区三区 | 久久精品最新免费国产成人 | 婷婷在线观看香蕉五月天 | 亚洲男人的天堂久久香蕉网 | 狼色视频在线观免费观看 | 伊人久久精品成人网 | 国产香蕉98碰碰久久人人 | 久久99精品久久久久久秒播 | 亚洲综合视频一区 | 国产成人夜间影院在线观看 | 福利在线观看 | 黄色激情小说视频 | 中文字幕佐山爱一区二区免费 | 中文字幕va | 色97色| 天天干天天透 | 天天干天天操天天爱 | 亚洲人成网站在线观看妞妞网 | 又黄又爽又猛午夜性色播在线播放 | 拍拍拍成人免费高清视频 | www亚洲成人 | 午夜精品久久久久蜜桃 | 国产单男 | 美女网站黄在线看 | 日韩在线免费看网站 | 性夜黄 a 爽免费看 性夜黄a爽影免费看 | 激情福利 | 国产一二三区精品 | 天天夜干| 男人性天堂| 三级视频网站在线观看 | 午夜爱爱爱爱爽爽爽网站免费 | 三级精品视频在线播放 |