国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

深圳網(wǎng)絡(luò)公司做網(wǎng)站臺(tái)州網(wǎng)站seo

深圳網(wǎng)絡(luò)公司做網(wǎng)站,臺(tái)州網(wǎng)站seo,山東富泰建設(shè)工程有限公司網(wǎng)站,卓越 網(wǎng)站建設(shè) 深圳西鄉(xiāng)1. 介紹 Java應(yīng)用程序可以通過Graalvm Native Image提前編譯生成與本地機(jī)器相關(guān)的可執(zhí)行文件。與在JVM執(zhí)行java程序相比,Native Image占用內(nèi)存更小和啟動(dòng)速度更快。 從spring boot3開始支持GraalVM Native Image,因此要使用此特性,需要把sp…

1. 介紹

Java應(yīng)用程序可以通過Graalvm Native Image提前編譯生成與本地機(jī)器相關(guān)的可執(zhí)行文件。與在JVM執(zhí)行java程序相比,Native Image占用內(nèi)存更小和啟動(dòng)速度更快。

從spring boot3開始支持GraalVM Native Image,因此要使用此特性,需要把spring boot升級(jí)到3.0.0以上, 其中,JDK也要升級(jí)到17以上。

官方提供的示例見Developing Your First GraalVM Native Application。示例代碼與普通spring boot一樣,可以忽略,繼續(xù)看下面內(nèi)容。

1.1 maven插件配置

示例中與spring boot項(xiàng)目一樣,不同之處在于打包配置,比如maven pom.xml文件中需要加上graalvm的native-maven-plugin插件,如下:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.0</version><relativePath/>
</parent><!--省略--><dependencies>
<!--省略-->
</dependencies><build><plugins><plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!--其它插件--></plugins>
</build>

pom說明:<parent>項(xiàng)指定為spring-boot-starter-parent,這樣你就可以減少許多配置,就像上面一樣。
spring-boot-starter-parent中為生成Native Image定義了名為native的profile,打包生成可執(zhí)行文件使用如下maven命令

mvn clean package -Pnative

1.2 maven插件完整配置

如果pom的<parent>項(xiàng)不是spring-boot-starter-parent,你就需要像如下配置

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.3.0</version><configuration><archive><manifestEntries><Spring-Boot-Native-Processed>true</Spring-Boot-Native-Processed></manifestEntries></archive></configuration>
</plugin>
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>3.3.0</version><configuration><image><builder>paketobuildpacks/builder-jammy-tiny:latest</builder><env><BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE></env></image></configuration><executions><execution><id>process-aot</id><goals><goal>process-aot</goal></goals></execution></executions>
</plugin>
<plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId><version>0.10.2</version><configuration><classesDirectory>${project.build.outputDirectory}</classesDirectory></configuration><executions><execution><id>add-reachability-metadata</id><goals><goal>add-reachability-metadata</goal></goals></execution></executions>
</plugin>

2. 開發(fā)注意事項(xiàng)

Spring Boot對(duì)自身提供的bean自動(dòng)注入、AOP配置、factories等特性做了Native支持,在靜態(tài)編譯期間相關(guān)類都可達(dá),
但我們的項(xiàng)目中還有些不受spring AOT支持的代碼,比如業(yè)務(wù)代碼中的反射、JSON和對(duì)象轉(zhuǎn)換、以及三方j(luò)ar包中動(dòng)態(tài)代碼等。
我們需要手動(dòng)配置提供hint,graalvm才能把這些動(dòng)態(tài)代碼編譯到可執(zhí)行文件中去,否則執(zhí)行時(shí)會(huì)拋出異常。

2.1 項(xiàng)目中動(dòng)態(tài)代碼支持

提供動(dòng)態(tài)代碼的hint配置,有三種方式:

  1. 第一種遵從graalvm規(guī)范提供相應(yīng)的json配置,這個(gè)可以見往期分享Graalvm配置文件與Feature和Substitute機(jī)制介紹
  2. 第二種擴(kuò)展Spring接口,即實(shí)現(xiàn)RuntimeHintsRegistrar接口,通過代碼指定哪些類、資源需要hint。
  3. 第三種反射類可以使用@RegisterReflectionForBinding由spring自動(dòng)綁定反射配置。

下面介紹后面兩種方式

2.1.1 擴(kuò)展Spring接口RuntimeHintsRegistrar

  1. 示例代碼如下:
    public class MyAOTRuntimeHints implements RuntimeHintsRegistrar {@Overridepublic void registerHints(RuntimeHints hints, ClassLoader classLoader) {// Register method for reflection//        Method method = ReflectionUtils.findMethod(MyClass.class, "sayHello", String.class);//        hints.reflection().registerMethod(method, ExecutableMode.INVOKE);// 反射注冊(cè)hints.reflection().registerType(UserModel.class, typeHint -> {typeHint.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,MemberCategory.INVOKE_DECLARED_METHODS,MemberCategory.DECLARED_FIELDS);});// 資源文件注冊(cè)hints.resources().registerPattern("resource_hint.properties");// Serialization類注冊(cè)hints.serialization().registerType(Email.class);// 代理注冊(cè)// hints.proxies().registerJdkProxy(MyInterface.class);}
    }
    
  2. 注冊(cè)Hint類。MyAOTRuntimeHints還需要使用@ImportRuntimeHints注解到任何@Configuration class,或者在META-INF/aot.factories文件注冊(cè)
    1. 使用@ImportRuntimeHints
      @Configuration
      @ImportRuntimeHints(value = {MyAOTRuntimeHints.class})
      public class AOTConfiguration {}
      
    2. 注冊(cè)META-INF/aot.factories
      org.springframework.aot.hint.RuntimeHintsRegistrar=com.example.springnative.aot.hit.MyAOTRuntimeHints
      

2.1.2 使用注解@RegisterReflectionForBinding

對(duì)于項(xiàng)目中使用反射的地方,可以直接通過注解來配置hint,把@RegisterReflectionForBinding注解到任何@Configuration class類上。
示例如下:

@Configuration
@RegisterReflectionForBinding(classes = {MyJSONBean.class})
public class AOTConfiguration {}

2.2 代碼中隱式使用反射的地方

2.2.1 JSON

json工具推薦使用jackson,spring中也對(duì)其做了支持。
把對(duì)象轉(zhuǎn)為json或把json轉(zhuǎn)為對(duì)象,對(duì)象中所有類都要注冊(cè)反射hint。
如UserModel在在reflect-config.json配置如下

{
"name": "com.example.springnative.model.UserModel",
"allPublicConstructors": true,
"allDeclaredFields": true,
"allPublicMethods": true
}

如果javabean實(shí)現(xiàn)了java.io.Serializable接口,可以在serialization-config.json中注冊(cè),示例如下。

{
"name": "com.example.springnative.model.UserModel"
}

2.3 Configuration Properties類嵌套

如果Properties類嵌套了其它類型,則必須要使用@NestedConfigurationProperty注解,否則spring AOT沒法識(shí)別到這個(gè)嵌套類,就不能為其注冊(cè)反射hint。如下示例。

@ConfigurationProperties(prefix = "my.properties")
public class MyProperties {@NestedConfigurationPropertyprivate final Nested nested = new Nested();// getters / setters...
}public class Nested {private int number;// getters / setters...}

2.4 Native Image執(zhí)行與JVM執(zhí)行區(qū)別

  1. 應(yīng)用程序類路徑在生成時(shí)是固定的,不能更改。
  2. 沒有延遲類加載,可執(zhí)行文件中提供的所有內(nèi)容都將在啟動(dòng)時(shí)加載到內(nèi)存中。
  3. 應(yīng)用程序中定義的Bean不能在運(yùn)行時(shí)更改,即bean創(chuàng)建相關(guān)的條件配置在編譯后就不能再更改。
    如@Profile注解及類似配置不能更改,@ConditionalOnProperty中的條件值不能更改,即使更改也不會(huì)生效,因?yàn)閎ean已經(jīng)創(chuàng)建了。

3. 原理簡(jiǎn)述

  1. Spring AOT Processor會(huì)啟動(dòng)應(yīng)用main方法開始靜態(tài)分析,并生成BeanDefinition對(duì)象,但不會(huì)創(chuàng)建bean
  2. 分析階段不可達(dá)的代碼將被忽略,不會(huì)編譯到可執(zhí)行文件中。
  3. 在編譯前會(huì)生成java代碼來創(chuàng)建BeanDefinition對(duì)象。源碼存放到target/spring-aot/main/sources
  4. AOP原本在運(yùn)行時(shí)動(dòng)態(tài)生成的字節(jié)碼,但在編譯時(shí)就必須生成,動(dòng)態(tài)字節(jié)碼存放在target/spring-aot/main/classes
  5. Spring AOT Processor生成native需要的hint文件,存放到target/spring-aot/main/resources
  6. Spring boot把所有生成的文件都編譯到j(luò)ar包中,關(guān)于hint文件都放到j(luò)ar包的META-INF/native-image目錄下,graalvm靜態(tài)編譯時(shí)會(huì)獲取該目錄下的hint配置文件。

4. 官方文檔閱讀

Known GraalVM Native Image limitations

Testing GraalVM Native Images

Introducing GraalVM Native Images

5. 總結(jié)

  1. maven插件配置有兩種方式,
    1. 一種是pom的parent指定為spring-boot-starter-parent后簡(jiǎn)單引入spring的spring-boot-maven-plugin和graalvm的native-maven-plugin插件
    2. 另一種是完整的配置spring的spring-boot-maven-plugin插件指定process-aot目標(biāo),配置graalvm的native-maven-plugin插件指定add-reachability-metadata目標(biāo)
  2. 動(dòng)態(tài)代碼需要由開發(fā)者指定hint配置,有3種方式:
    1. 使用graalvm原生支持的方式,在META-INF/native-image目錄下添加反射、代理、JNI等相關(guān)json配置。
    2. 實(shí)現(xiàn)RuntimeHintsRegistrar接口通過代碼方式注冊(cè)hint配置。
    3. 反射類可以使用@RegisterReflectionForBinding由spring自動(dòng)綁定反射配置。
  3. 編譯后影響bean創(chuàng)建相關(guān)的配置在運(yùn)行期間不起作用,如@ConditionalOnProperty中的條件。
http://aloenet.com.cn/news/30569.html

相關(guān)文章:

  • 一對(duì)一直播軟件開發(fā)夫唯老師seo
  • 購(gòu)物網(wǎng)站最重要的功能我要登錄百度
  • 保定哪做網(wǎng)站好企業(yè)查詢信息平臺(tái)
  • 做網(wǎng)站切圖網(wǎng)址怎么申請(qǐng)注冊(cè)
  • 黃山做網(wǎng)站公司關(guān)鍵詞搜索神器
  • 建網(wǎng)站比較靠譜的公司新媒體營(yíng)銷推廣方案
  • 泰安網(wǎng)站制作服務(wù)2000元代理微信朋友圈廣告
  • 更改wordpress主題百度關(guān)鍵詞優(yōu)化多久上首頁(yè)
  • 專門做二手書網(wǎng)站或app百度云搜索引擎入口網(wǎng)盤搜索神器
  • 國(guó)外做燈的網(wǎng)站市場(chǎng)推廣方案
  • 怎么引導(dǎo)做淘寶的客戶做官方網(wǎng)站唐山seo排名優(yōu)化
  • 做畢業(yè)設(shè)計(jì)網(wǎng)站的步驟怎么把網(wǎng)站排名排上去
  • 網(wǎng)站維護(hù)包括深圳企業(yè)網(wǎng)站制作公司
  • 全國(guó)互聯(lián)網(wǎng)安全管理服務(wù)平臺(tái)seo免費(fèi)推廣軟件
  • 社交媒體 網(wǎng)站網(wǎng)址seo關(guān)鍵詞
  • 福安網(wǎng)站定制怎么樣推廣自己的店鋪和產(chǎn)品
  • 外國(guó)電商設(shè)計(jì)網(wǎng)站有哪些品牌策劃設(shè)計(jì)
  • 我想在鄭卅淘寶網(wǎng)站做客服怎么做寧波seo服務(wù)推廣
  • 南昌手機(jī)網(wǎng)站建設(shè)找資源
  • php網(wǎng)站開發(fā)案例教程廣告聯(lián)盟app下載官網(wǎng)
  • 上海做網(wǎng)站 公司排名視頻號(hào)排名優(yōu)化帝搜軟件
  • 做網(wǎng)站要多少錢呀產(chǎn)品推廣步驟
  • 泰達(dá)建設(shè)集團(tuán)網(wǎng)站廈門最快seo
  • 免費(fèi)域名建站鄭州網(wǎng)站推廣電話
  • 服務(wù)好的網(wǎng)站制作鄭州seo排名優(yōu)化
  • 定制網(wǎng)站建設(shè)公司費(fèi)用搜狗收錄查詢
  • wordpress 目錄遍歷電腦優(yōu)化設(shè)置
  • 10_10_微信里網(wǎng)站怎么做的seo搜索如何優(yōu)化
  • 漂亮的手機(jī)網(wǎng)站模板北京優(yōu)化seo排名優(yōu)化
  • 建網(wǎng)站的要求寧波優(yōu)化關(guān)鍵詞首頁(yè)排名