Quarkus的Spring擴展快速改造Spring項目
前言
博主上個禮拜,已經(jīng)實現(xiàn)了quarkus的native image應(yīng)用的上線,經(jīng)過兩天的監(jiān)控下來,一切運行指標良好,就是內(nèi)存升到了100M了,這個后續(xù)繼續(xù)跟進觀察。今天聊點老的spring應(yīng)用改造成quarkus的問題。一個新的框架是否可以順利的在一個公司落地,除了本身優(yōu)秀的設(shè)計和優(yōu)異的性能外,框架的生態(tài)和上手的難度以及對現(xiàn)有框架的兼容性都是非常重要的考量因素,在quarkus之前,使用最廣泛的web框架就是spring webmvc框架了,數(shù)據(jù)訪問層用的多的也是spring data jpa等。quarkus充分考慮了這種spring用戶的需求,官方出品了多個針對spring環(huán)境的遷移擴展包,有了這些spring擴展,可以非常輕松的從spring應(yīng)用遷移到quarkus平臺上來。
spring-webmvc擴展
添加擴展依賴
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-spring-web</artifactId> </dependency>
兼容以下spring的注解用法
@RestController @RequestMapping("/test") public class TestController { @GetMapping("/hello") public String hello(@RequestParam("name") String name){ return "hello" + name; } @PostMapping("/hello") public String hello1(@RequestBody Hello hello){ return "hello" + hello.getName(); } @GetMapping("/{name}") public String hello2(@PathVariable(name = "name") String name) { return "hello" + name; } class Hello{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } }
以上示例了最基本的restfull接口用法,quarkus的spring-web擴展常用的spring注解基本都支持了,但是使用時要注意,有些用法可能稍微有點不兼容,比如GET請求參數(shù)映射,純spring環(huán)境下,可以不用@RequestParam注解綁定,但是quarkus環(huán)境下就必須使用@RequestParam注解綁定入?yún)?,還有spring下的MultipartFile不支持,涉及到表單文件上傳的場景必須要改成JAX-RS的標準模式才行,這塊會單獨來寫。
spring-datajpa擴展
添加擴展依賴
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-spring-data-jpa</artifactId> </dependency>
兼容以下spring-data-jpa的用法
public interface MovieRepository extends CrudRepository<Movie, Long> { Movie findFirstByOrderByDurationDesc(); @Query("select m from Movie m where m.rating = ?1") Iterator<Movie> findByRating(String rating); @Query("from Movie where title = ?1") Movie findByTitle(String title); @Query("select m from Movie m where m.duration > :duration and m.rating = :rating") List<Movie> withRatingAndDurationLargerThan(@Param("duration") int duration, @Param("rating") String rating); @Query("from Movie where title like concat('%', ?1, '%')") List<Object[]> someFieldsWithTitleLike(String title, Sort sort); @Modifying @Query("delete from Movie where rating = :rating") void deleteByRating(@Param("rating") String rating); @Modifying @Query("delete from Movie where title like concat('%', ?1, '%')") Long deleteByTitleLike(String title); @Modifying @Query("update Movie m set m.rating = :newName where m.rating = :oldName") int changeRatingToNewName(@Param("newName") String newName, @Param("oldName") String oldName); @Modifying @Query("update Movie set rating = null where title =?1") void setRatingToNullForTitle(String title); @Query("from Movie order by length(title)") Slice<Movie> orderByTitleLength(Pageable pageable); }
如下的接口定義都支持
org.springframework.data.repository.Repository
org.springframework.data.repository.CrudRepository
org.springframework.data.repository.PagingAndSortingRepository
org.springframework.data.jpa.repository.JpaRepository
Hibernate ORM使用物理命名策略和隱式命名策略來映射屬性名稱。如果您希望使用Spring Boot的默認命名策略,spring-data-jpa擴展包也提供了支持,只需要設(shè)置以下屬性:
quarkus.hibernate-orm.physical-naming-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
博主之前沒了解到spring擴展之前,也遇到了相同的問題,最后只能從spring將命名策略拷貝到本工程里。不得不說quarkus想的還是蠻周到的
spring-Di擴展
添加擴展依賴
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-spring-di</artifactId> </dependency>
兼容以下IOC用法
@Configuration public class TestConfig { @Autowired private AccountRepository repository; @Value("${acc}") private String acc; @Bean AccountService accountService() { return new AccountService(repository); } }
以上示例了最基礎(chǔ)的用法,聲明一個服務(wù)的@service、@Compoment等都支持,下面是支持的spring注解和JAX-RS的注解對照表
spring-boot-properties擴展
添加擴展依賴
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-spring-boot-properties</artifactId> </dependency>
支持以下spring配置方式
@ConfigurationProperties("greeting") public class GreetingProperties { public String text; }
結(jié)語
quarkus的這些spring擴展,看上去就和spring一樣,其實底層實現(xiàn)完全不一樣,quarkus并沒有引入spring的bean、context等容器上下文,這些擴展僅僅是作為注解元數(shù)據(jù)信息使用而已。以上列舉了四種常見的spring使用擴展支持,quarkus支持的擴展還有Spring-Scheduled、Spring-Cache、Spring-Security、Spring Cloud Config Server,這里就不一一列舉了,可以點擊鏈接查看官方的文檔。隨著quarkus社區(qū)的迭代,spring擴展兼容支持會越來愈好越來越多,不過那個時候也有可能spring boot也追趕上了GraalVm,無論怎樣,對于我們開發(fā)者而言,多個選擇總是好的。
以上就是Quarkus的Spring擴展快速改造Spring項目的詳細內(nèi)容,更多關(guān)于Quarkus擴展改造Spring項目的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java并發(fā)程序刺客之假共享的原理及復(fù)現(xiàn)
前段時間在各種社交平臺“雪糕刺客”這個詞比較火,而在并發(fā)程序中也有一個刺客,那就是假共享。本文將通過示例詳細講解假共享的原理及復(fù)現(xiàn),需要的可以參考一下2022-08-08Springboot @Validated和@Valid的區(qū)別及使用詳解
這篇文章主要介紹了Springboot @Validated和@Valid的區(qū)別及使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2020-05-05java實現(xiàn)圖片轉(zhuǎn)base64字符串 java實現(xiàn)base64字符串轉(zhuǎn)圖片
這篇文章主要為大家詳細介紹了java實現(xiàn)圖片轉(zhuǎn)base64字符串,java實現(xiàn)base64字符串轉(zhuǎn)圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02Mybatis-Plus實現(xiàn)自動生成代碼的操作步驟
AutoGenerator 是 MyBatis-Plus 的代碼生成器,通過 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個模塊的代碼,極大的提升了開發(fā)效率,本文將給大家介紹Mybatis-Plus實現(xiàn)自動生成代碼的操作步驟2023-10-10